使用xargs

时间:2018-11-12 18:54:32

标签: bash shell xargs parameter-expansion

我想重命名find在某个目录中选择的几个文件,然后使用xargsmv重命名这些文件,并带有 parameter expand 。但是,它不起作用...

示例

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无效,因为我认为第二种方法不是很有效一般用于类似任务。

谢谢!

1 个答案:

答案 0 :(得分:1)

请记住,在您的命令运行之前之前发生了外壳变量替换。因此,当您运行时:

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