有时候我使用 xargs
命令时,并不需要显式地使用替换字符串:
find . -name "*.txt" | xargs rm -rf
在其他情况下,我想要指定替换字符串以执行像这样的操作:find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
前一个命令将当前目录下所有的文本文件移动到 /foo
并将扩展名改为 bar
。
如果我想修改替换字符串而不是在其末尾添加一些文本,那该怎么做呢?比如说,我想要实现与上一个示例中相同的功能,但文件应该被重命名/移动到 /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}"' -- {}
但我想知道是否有更短/更好的解决方案。
mv "$1" "foo/${name}.bar.${ext}"
并且你可以这样使用basename
:base=${1##*/}
。你应该将你的解决方案发布为答案并接受它。 - Dennis Williamson