我正在尝试逐个对文件列表执行一系列命令。我想知道是否可以使用 xargs 来执行类似以下操作
ls *.txt | xargs -n 1 -I {} cat {} | grep foo > {}.foo
在哪里
cat {} | grep foo > {}.foo
是我想要对每个文件执行的命令。
答案1
也许可以使用类似
xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'
或者,摆脱无用的cat
xargs -n1 -I{} sh -c 'grep foo {} > ().foo'
通常将其放入 shell 脚本中会更容易,这样您只需传递文件即可。
cat > fiddle.sh <<\EOF
for f in "$@"; do
grep foo "$f" >"$f.foo"
done
EOF
ls *.txt | xargs sh fiddle.sh # note we can now pass multiple files, no -n1 or -I needed
迂腐: ls
无法正确处理文件名中的特殊字符,尤其是嵌入的换行符。我会xargs
完全转储,并且(根据上述脚本)只需执行
sh fiddle.sh *.txt
甚至
for f in *.txt; do grep foo "$f" >"$f.txt"; done
按照提示操作。