当我xargs有时使用时,我不需要显式使用替换字符串:
find . -name "*.txt" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
在其他情况下,我想指定替换字符串,以便执行以下操作:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
Run Code Online (Sandbox Code Playgroud)
上一个命令会将当前目录下的所有文本文件移入/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}"' -- {}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更短/更好的解决方案.
fai*_*dox 34
以下命令使用xargs构造move命令,替换第二次出现的'.' 使用'.bar.',然后使用bash执行命令,在mac OSX上工作.
ls *.txt | xargs -I {} echo mv {} foo/{} | sed 's/\./.bar./2' | bash
Run Code Online (Sandbox Code Playgroud)
San*_*rix 22
可以在一次通过(在GNU中测试)中执行此操作,避免使用临时变量赋值
find . -name "*.txt" | xargs -I{} sh -c 'mv "$1" "foo/$(basename ${1%.*}).new.${1##*.}"' -- {}
Run Code Online (Sandbox Code Playgroud)
gle*_*man 17
在这种情况下,while循环会更具可读性:
find . -name "*.txt" | while IFS= read -r pathname; do
base=$(basename "$pathname"); name=${base%.*}; ext=${base##*.}
mv "$pathname" "foo/${name}.bar.${ext}"
done
Run Code Online (Sandbox Code Playgroud)
请注意,您可能会在不同的子目录中找到具有相同名称的文件.是否可以覆盖重复的副本mv?
Ole*_*nge 11
如果你安装了GNU Parallel http://www.gnu.org/software/parallel/,你可以这样做:
find . -name "*.txt" | parallel 'ext="{/}" ; mv -- {} foo/{/.}.bar.${ext##*.}'
Run Code Online (Sandbox Code Playgroud)
观看GNU Parallel的介绍视频以了解更多信息:https: //www.youtube.com/playlist?list = PL284C9FF2488BC6D1
| 归档时间: |
|
| 查看次数: |
47416 次 |
| 最近记录: |