【问题标题】:renaming series of files using xargs使用 xargs 重命名一系列文件
【发布时间】:2018-11-12 18:54:31
【问题描述】:

我想重命名某个目录中find 选择的几个文件,然后使用xargs 和mv 重命名这些文件,并带有参数扩展。但是,它没有用......

示例:

mkdir test
touch abc.txt
touch def.txt

find . -type f -print0 | \
xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"

结果:

bad substitution
[1]    134 broken pipe  find . -type f -print0

工作解决方案:

for i in ./*.txt ; do mv "$i" "${i/.txt/.tx}" ; done

虽然我终于找到了解决问题的方法,但我仍然想知道为什么第一种find + xargs 方法不起作用,因为我认为第二种方法对于类似的任务不是很通用.

谢谢!

【问题讨论】:

    标签: bash shell xargs parameter-expansion


    【解决方案1】:

    请记住,shell 变量替换发生在您的命令运行之前。所以当你运行时:

    find . -type f -print0 | \
    xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"
    

    shell 会尝试在 xargs 之前扩展 ${...} 构造 运行...并且由于该表达式的内容不是有效的 shell 变量引用,因此您会收到错误消息。更好的解决方案是使用rename 命令:

    find . -type f -print0 | \
    xargs -I {} -0 rename .txt .tx {}
    

    而且由于rename可以对多个文件进行操作,所以可以简化 到:

    find . -type f -print0 | \
    xargs -0 rename .txt .tx
    

    【讨论】:

    • 'shell 变量替换发生在你的命令运行之前',这是一个金字,非常感谢!我对rename 不熟悉,所以会引出另一个问题:如果我想替换文件名的一些中间部分,而不仅仅是前缀或后缀,我怎么能用rename 做到这一点?
    • 重命名实际上是对整个文件名进行操作,例如rename foo bar * 会将this_foo_example 重命名为this_bar_example。查看rename 手册页并进行一些实验。如果它没有按照您想要的方式工作,请考虑发布一个新问题。
    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2012-06-13
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多