我正在尝试一个接一个地对文件列表执行一系列命令。我想知道是否可以在以下行中使用 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)
是我想对每个文件执行的命令。
可能会使用类似的东西
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)
就在提示下。
| 归档时间: |
|
| 查看次数: |
11699 次 |
| 最近记录: |