xargs 与多个命令

xargs 与多个命令

我正在尝试逐个对文件列表执行一系列命令。我想知道是否可以使用 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

按照提示操作。

相关内容