我试图找到所有出现的文件,其中包含指定的字符串,然后清除所有这些文件的内容。因此,其中包含“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'
答案 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
应该对此感到满意。
但是,虽然这将解决find
和grep
之间管道中的问题,但它不允许将管道中的零分隔名称从grep
传递到{{ 1}}。因此,sed
仍然会抱怨...
因此,您应使用sed
在grep
内使用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