Linux 一起使用find、grep和sed
我试图找到所有出现的文件,其中有一个指定的字符串,然后清除所有这些文件的内容。因此,包含“stringtofind”的文件随后将成为空文件 为此,我尝试了以下方法,但出现了错误: 由于出现以下错误:find:“-exec”缺少参数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 :
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..)中的文件写入
,writefind.|而IFS=read-r file
,以适应文件名中的空格。并始终引用变量-write“$file“
不是$file
。我不能使用parallel,我将要使用它的系统不会有它。@user1166981:parallel是一个自包含的perl脚本,因此如果有perl,它应该可以工作。”。您也可以在末尾粘贴一个while循环,请参见编辑。@user1166981:while循环选项仅依赖于bash。只需在读取行中添加IFS=
,以容纳以空格开头或结尾的文件名。在这种情况下不太可能,但在默认情况下,您应该始终将IFS=
放在读取之前,除非您有特定的理由不这样做,否则这会降低您在可能的情况下忘记它的可能性!如果遵循Ed Morton的建议,这是发布的唯一一个没有错误的解决方案,并且从文件中删除非空行的效率远远高于sed-i
。