我正在尝试删除包含" Cl"的所有行。在目录中的50个文件中: 并将修改后的文件发送到子目录no_cl
grep -vE "Cl" *.pdb > no_cl/$*.pdb
然而,这不起作用,
如何在此语句中使用通配符?
答案 0 :(得分:0)
<强> find -name "*.pdb" -type f -print0 | xargs -t -n1 -0 -I % sh -c 'grep -vE Cl % > no_cl/%'
强>
讨论:
您可以根据shell使用shell循环,但使用find
和xargs
,您可以将标准输入的文件列表转换为多个grep
调用。
/bin/ls *.pdb | xargs -t -n 1 -I % sh -c 'grep -vE Cl % > no_cl/%'
使用/bin/ls
(防止使用ls
的任何别名)获取*.pdb
,使用xargs
管道转移-n 1
将每个输入令牌转换为命令。 -I %
告诉xargs用输入标记替换%
。然后使用Xargs执行sh -c 'grep -vE Cl % > no_cl/%
。 -t
回显xargs执行的每个命令。
如果任何文件名中包含空格,则会中断。等等read this for more "don't use ls" discussion。
或者:find -name "*.pdb" -type f -exec sh -c 'grep -vE Cl < "{}" > "no_cl/{}"' \;
...也可能与空间打破。 find -exec
语法很奇怪。
所以,两全其美。使用find
表示空终止文件列表,使用xargs
执行grep
每个文件:
<强> find -name "*.pdb" -type f -print0 | xargs -t -n1 -0 -I % sh -c 'grep -vE Cl % > no_cl/%'
强>
-print0
告诉find
使用空终止,-0
告诉xargs
期望它。