是否有终端命令可以删除包含给定文本的文件?
假设我有三个文件,其中一些包含文本“extract($_REQUEST)”:
file-1.php
:该文件包含文本“extract($_REQUEST)”file-2.txt
: 我不file-3.html
:该文件包含文本“extract($_REQUEST)”
我正在寻找的命令将删除文件:file-1.php
和file-3.html
。
更新: 该文件应该删除该文件除非“extract($_REQUEST)”是文件中唯一的文本行。请参阅下面的示例:
file-4.php
: 这个文件只是包含文本“extract($_REQUEST)”file-5.php
:该文件包含文本“extract($_REQUEST)”以及其他文本行
然后命令会删除file-4.php
,不会删除file-5.php
。
答案1
find . -maxdepth 1 -type f \
-exec fgrep -q 'extract($_REQUEST)' '{}' ';' \
-not -exec fgrep -vq 'extract($_REQUEST)' '{}' ';' \
-delete
find .
搜索当前目录-maxdepth 1
并且没有子目录-type f
查找文件-exec
并为每个执行此测试fgrep
纯字符串搜索-q
没有可见的输出'extract($_REQUEST)'
对于这个字符串'{}'
在你找到的文件中';'
[执行结束]
-not
不是下一个测试-exec
再次执行fgrep
再次 fgrep-vq
但这一次寻找不匹配的行'extract($_REQUEST)'
寻找相同的模式'{}'
在文件中
';'
[执行结束]
-delete
删除它们
这是有效的,因为 exec 也是一个测试,当 fgrep 找到匹配项时,测试成功并且删除运行。如果 grep 返回 false,则删除未完成。
答案2
grep -FRl 'extract($_REQUEST)' | xargs rm -fv
grep
- 搜索文件中的文本。-F
- 按原样对待字符串,忽略可能的正则表达式。-R
- 递归搜索。-l
- 仅打印文件名。xargs
- 将输出提供给下一个程序。rm
- 消除。-f
- 强制(不要问“你确定吗?”)。-v
- 是可选的,它将删除已删除的文件。
更新:
为了仅删除具有精确文本的文件,我建议还检查文件中的字符数。
for i in $(grep -FRl 'extract($_REQUEST)'); do [[ $(cat $i | wc -c) == "19" ]] && rm -fv $i; done
wc -c
- 计算文件中的字符数。由于您提供的示例 (extract($_REQUEST)
) 的长度为 19 个字符(包括换行符),因此我在示例中使用了这个数字,请随意更改它以适合您的情况。
答案3
命令
find . -maxdepth 1 -type f -exec grep -l "string_to_be_searched" {} \;|awk '{print $1}'| sed "s/\.\///g"| awk '{print "rm -rvf" " " $1}'| sh
注:经过测试,效果很好