Linux 一起使用find、grep和sed

Linux 一起使用find、grep和sed,linux,sed,grep,find,Linux,Sed,Grep,Find,我试图找到所有出现的文件,其中有一个指定的字符串,然后清除所有这些文件的内容。因此,包含“stringtofind”的文件随后将成为空文件 为此,我尝试了以下方法,但出现了错误: 由于出现以下错误:find:“-exec”缺少参数 find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l -exec sed -i '/./d' 以下是我得到的错误: grep:/nis /任何 /test2.0文件 /test.txt :

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

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

由于出现以下错误:find:“-exec”缺少参数

 find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l -exec sed -i '/./d'
以下是我得到的错误:

grep:/nis

/任何

/test2.0文件

/test.txt

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

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

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

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

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

find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -q "{}" \; -print0 | xargs -0 sed '/./d'
通过仅运行命令的第一部分(不包括
|
),您就可以获得要清空的文件列表

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'
单向:

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

您需要为
-exec
指定文件标记(
{}
)和终止(
+
)。此外,我建议您使用GNU并行处理文件:

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

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

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

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

我想删除文件中的所有文本
>文件
将删除文件中的所有文本,不需要sed、perl等。您好,我遇到了以下错误:sed:can't read/tset.txt/test2.file:没有这样的文件或目录您尝试过没有
sed
命令吗?只列出文件即可这将被清空。find/-maxdepth 1-xdev-type f-print-exec grep-i“stringtofind”-q{};给了我:/nis/tset.txt/test2.file/test.fileLooks OK。尝试管道传输到
xargs-0 ls-l
。它是否正确列出了文件?如果文件名包含空格或全局字符,将失败,永远不会为$(find..)中的文件写入
,write
find.|而IFS=read-r file
,以适应文件名中的空格。并始终引用变量-write
“$file“
不是
$file
。我不能使用parallel,我将要使用它的系统不会有它。@user1166981:parallel是一个自包含的perl脚本,因此如果有perl,它应该可以工作。”。您也可以在末尾粘贴一个while循环,请参见编辑。@user1166981:while循环选项仅依赖于bash。只需在读取行中添加
IFS=
,以容纳以空格开头或结尾的文件名。在这种情况下不太可能,但在默认情况下,您应该始终将
IFS=
放在读取之前,除非您有特定的理由不这样做,否则这会降低您在可能的情况下忘记它的可能性!如果遵循Ed Morton的建议,这是发布的唯一一个没有错误的解决方案,并且从文件中删除非空行的效率远远高于
sed-i