一起使用find,grep和sed

时间:2012-12-12 11:41:15

标签: linux sed grep find

我试图找到所有出现的文件,其中包含指定的字符串,然后清除所有这些文件的内容。因此,其中包含“stringtofind”的文件随后将是一个空文件。

要做到这一点,我尝试了以下内容,但是我收到了错误:

以下我得到错误:find:缺少`-exec'的参数

 find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l -exec sed -i '/./d'

以下我收到错误:

grep:/ nis

/tset.any

/test2.file

/test.txt

:没有这样的文件或目录 sed:没有输入文件

find / -maxdepth 1 -xdev -type f -print | xargs -0 grep -i "stringtofind" -l | xargs sed -i '/./d'

5 个答案:

答案 0 :(得分:4)

带缺少参数的find命令非常接近工作。尝试:

find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l {} \; -exec sed -i '/./d' {} \;

你只需要在每个-exec操作的末尾添加一个反斜杠转义分号,然后添加{}让它知道替换文件名的位置。

答案 1 :(得分:2)

您需要指定文件标记({})和终止(;+)到-exec。另外我建议您使用GNU parallel处理文件:

find / -maxdepth 1 -xdev -type f -exec grep -li "stringtofind" {} + | 
  parallel sed "'/./d'" '{}'

要处理其中包含换行符的文件名,您需要按照其他人的建议使用零终止:

find / -maxdepth 1 -xdev -type f -exec grep -Zli "stringtofind" {} + | 
  parallel -0 sed "'/./d'" '{}'

修改

这是一个非并行的依赖替代方案:

find / -maxdepth 1 -xdev -type f -exec grep -Zli "stringtofind" {} + | 
  while IFS= read -r -d $'\0' file; do
    sed '/./d' "$file"
  done

答案 2 :(得分:1)

包含空格的文件名存在问题。将-0参数用于xargs时,您应使用-print0作为find的最终参数。 grep应该对此感到满意。

但是,虽然这将解决findgrep之间管道中的问题,但它不允许将管道中的零分隔名称从grep传递到{{ 1}}。因此,sed仍然会抱怨...

因此,您应使用sedgrep内使用find进行测试,并使用单个管道-exec,如下所示。请注意在sed占位符周围使用双引号"

{}

通过仅运行命令的第一部分,最多但不包括find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -q "{}" \; -print0 | xargs -0 sed '/./d' ,它为您提供了能够获取将要清空的文件列表的优势。

答案 3 :(得分:1)

find / -maxdepth 1 -xdev -type f|xargs grep -l 'string'| xargs perl -pi -e 's/.*\n//g'

上面的命令甚至会删除文件中的换行符。如果要保留新行,只删除下面每行中的内容:

find / -maxdepth 1 -xdev -type f|xargs grep -l 'string'| xargs perl -pi -e 's/.//g'

答案 4 :(得分:0)

一种方式:

$ for file in $(find / -maxdepth 1 -xdev -type f  -exec grep -li stringtofind '{}' \;)
> do
>   > $file
> done