串在我使用xargs
有时我并不需要明确地使用替换字符串:修改替换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}"' -- {}
但我不知道是否有一个较短/更好的解决方案。
没有,但我会用更多的引用'MV “$ 1” “富/ $ {名称}的.bar $ {转}”'你可以做'。 basename'就像这样:'base = $ {1 ## * /}'。您应该将解决方案作为答案发布并接受它。 –
@DennisWilliamson感谢您的评论!我会再等一等,看看是否有人想出一些奇特的东西,否则我会自己回答这个问题。 – betabandido
我想如果你的文件名是最后一行,你不需要命令行中的-I {}和{}。 (请注意,xargs的目的是为了分组,所以如果你不想在1个xargs的参数调用结束时需要多个东西,你需要“-l 1”(或者-Lar的某些版本的xargs)。 -I {}暗示-l 1,所以这就是为什么这也适用于此。) –