长话短说,我有一个包含近 800,000 个 php 文件的文件夹。我想在每个文件中搜索一个字符串,如果该字符串存在于该文件中,则将该文件复制到另一个目录。
从终端可以做到这一点吗?
到目前为止我得到:
grep -i -n -r'ppr-1792'*|cp $1 移动到此处
但这显然不起作用。$1 需要是包含匹配文本的文件名。
我应该怎么办?
答案1
您可以使用 for 循环并测试 grep 的返回码,或者使用grep -c
(计数匹配)并查看匹配计数是否大于 1。
例如
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
答案2
您可以使用一行代码轻松完成此操作:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
一些注释说明了它的工作原理。如果文件中有匹配项,Grep 的 -l 选项将仅打印文件名,因此它会生成要复制的文件列表。Xargs 命令为每个复制命令构造一个命令并执行它。Xargs 将名为“source”的参数替换为从标准输入读取的文件名。文件名中的空格和其他奇怪的字符由 -Z 和 -0 选项处理。