在使用 xargs
时,有时不需要显式地使用替换字符串:
find . -name "*.txt" | xargs rm -rf
在其他情况下,我希望指定替换字符串,以便执行以下操作:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
之前的命令会将工作目录下的所有文本文件移动到 /foo
中,并将扩展名 bar
附加到所有文件中。
如果不是向替换字符串添加一些文本,而是修改该字符串,以便可以在文件的名称和扩展名之间插入一些文本,那么如何做到这一点呢?例如,假设我想执行与前面示例相同的操作,但是文件应该从 <name>.txt
重命名/移动到 /foo/<name>.bar.txt
(而不是 /foo/<name>.txt.bar
)。
更新 : 我设法找到了一个解决方案:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
但我想知道是否有一个更短/更好的解决方案。