Команда Linux для поиска и удаления файлов, содержащих заданный текст

Команда Linux для поиска и удаления файлов, содержащих заданный текст

Существует ли команда терминала для удаления файлов, содержащих заданный текст?

Допустим, у меня есть три файла, и некоторые из них содержат текст «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снова исполнитель
      • fgrepfgrep снова
        • -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

Примечание: проверено, работает отлично.

Связанный контент