4

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

为此,我尝试了以下方法,但出现错误:

随着以下我得到错误: find: missing argument to `-exec'

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

随着以下我得到错误:

grep:/ nis

/tset.any

/test2.文件

/test.txt

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

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

5 回答 5

5

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

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

您只需要在每个操作的末尾添加一个反斜杠转义分号-exec并添加{}以使其知道替换文件名的位置。

于 2012-12-12T16:36:46.123 回答
2

您需要为. {}_ 此外,我建议您使用 GNU 并行处理文件:;+-exec

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
于 2012-12-12T11:59:55.887 回答
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'
于 2012-12-12T11:52:28.540 回答
1

您对包含空格的文件名有疑问。使用 的-0参数时xargs,您应该使用-print0的最终参数findgrep应该对此感到高兴。

但是,虽然这将解决findand之间管道中的问题grep,但它不允许将管道中的零分隔名称从grepto 传递sed。所以,sed还是会抱怨...

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

find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -q "{}" \; -print0 | xargs -0 sed '/./d'

它使您能够通过仅运行命令的第一部分(最多但不包括|.

于 2012-12-12T11:51:49.013 回答
0

单程:

$ for file in $(find / -maxdepth 1 -xdev -type f  -exec grep -li stringtofind '{}' \;)
> do
>   > $file
> done
于 2012-12-12T11:59:01.453 回答