Существует ли команда терминала для удаления файлов, содержащих заданный текст?
Допустим, у меня есть три файла, и некоторые из них содержат текст «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
Примечание: проверено, работает отлично.