带有多个命令的 xargs

ana*_*rex 6 xargs

我正在尝试一个接一个地对文件列表执行一系列命令。我想知道是否可以在以下行中使用 xargs

ls *.txt | xargs -n 1 -I {} cat {} | grep foo > {}.foo
Run Code Online (Sandbox Code Playgroud)

在哪里

cat {} | grep foo > {}.foo
Run Code Online (Sandbox Code Playgroud)

是我想对每个文件执行的命令。

gee*_*aur 7

可能会使用类似的东西

xargs -n1 -I[] sh -c 'cat {} | grep foo > {}.foo'
Run Code Online (Sandbox Code Playgroud)

或者,摆脱无用的 cat

xargs -n1 -I{} sh -c 'grep foo {} > ().foo'
Run Code Online (Sandbox Code Playgroud)

将它放在一个 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
Run Code Online (Sandbox Code Playgroud)

Pedantry: ls不会对文件名中的特殊字符(特别是嵌入的换行符)做正确的事情。我会xargs完全转储,并且(给定上面的脚本)就这样做

sh fiddle.sh *.txt
Run Code Online (Sandbox Code Playgroud)

甚至

for f in *.txt; do grep foo "$f" >"$f.txt"; done
Run Code Online (Sandbox Code Playgroud)

就在提示下。