当我使用时xargs
有时我不需要显式使用替换字符串:
find . -name "*.txt" | xargs rm -rf
在其他情况下,我想指定替换字符串以便执行以下操作:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
上一个命令会将当前目录下的所有文本文件移动到/foo
它会附加扩展名bar
到所有文件。
如果我不想在替换字符串中附加一些文本,而是想修改该字符串,以便可以在文件的名称和扩展名之间插入一些文本,我该怎么做?例如,假设我想做与上一个示例相同的操作,但文件应该重命名/移动<name>.txt
to /foo/<name>.bar.txt
(代替/foo/<name>.txt.bar
).
UPDATE: 我设法找到解决方案:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
但我想知道是否有更短/更好的解决方案。
以下命令使用 xargs 构造移动命令,替换第二次出现的“.”与“.bar.”,然后使用 bash 执行命令,在 mac OSX 上工作。
ls *.txt | xargs -I {} echo mv {} foo/{} | sed 's/\./.bar./2' | bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)