Удалить файлы со строкой, найденной в файле - linux cli - PullRequest
44 голосов
/ 25 декабря 2010

Я пытаюсь удалить ошибочные электронные письма, основываясь на поиске адреса электронной почты в файле через Linux CLI.

Я могу получить файлы с

find . | xargs grep -l email@domain.com

Но я не могу понять, как удалить их оттуда, так как следующий код не работает.

rm -f | xargs find . | xargs grep -l email@domain.com

Спасибо за вашу помощь.

Ответы [ 7 ]

62 голосов
/ 25 декабря 2010

@ Мартин Беккет написал отличный ответ, следуйте этому руководству

решение для вашей команды:

grep -l email@domain.com * | xargs rm

Или

for file in $(grep -l email@domain.com *); do
    rm -i $file;
    #  ^ prompt for delete
done
58 голосов
/ 25 декабря 2010

В целях безопасности я обычно перенаправляю вывод команды find в что-то вроде awk и создаю командный файл с каждой строкой «rm filename»

Таким образом, вы можете проверить это перед фактическим запуском и вручную исправить любой нечетныйкрайние случаи, которые трудно сделать с помощью регулярного выражения

find . | xargs grep -l email@domain.com | awk '{print "rm "$1}' > doit.sh
vi doit.sh // check for murphy and his law
source doit.sh
13 голосов
/ 25 декабря 2010

Вы можете использовать find -exec и -delete, файл будет удален только в случае успеха команды grep.Используя grep -q, чтобы он ничего не печатал, вы можете заменить -q на -l, чтобы увидеть, какие файлы содержат строку.

2 голосов
/ 23 ноября 2017

Мне понравилось решение Мартина Беккета, но я обнаружил, что имена файлов с пробелами могут запутать его (например, кто использует пробелы в именах файлов, pfft: D). Кроме того, я хотел посмотреть, что сопоставляется, поэтому я перемещаю сопоставленные файлы в локальную папку, а не просто удаляю их командой «rm»:

# Make a folder in the current directory to put the matched files
$ mkdir -p './matched-files'

# Create a script to move files that match the grep
# NOTE: Remove "-name '*.txt'" to allow all file extensions to be searched.
# NOTE: Edit the grep argument 'something' to what you want to search for.

$ find . -name '*.txt' -print0 | xargs -0 grep -al 'something' | awk -F '\n' '{ print "mv \""$0"\" ./matched-files" }' > doit.sh

Or because its possible (in Linux, idk about other OS's) to have newlines in a file name you can use this longer, untested if works better (who puts newlines in filenames? pfft :D), version:

$ find . -name '*.txt' -print0 | xargs -0 grep -alZ 'something' | awk -F '\0' '{ for (x=1; x<NF; x++) print "mv \""$x"\" ./matched-files" }' > doit.sh

# Evaluate the file following the 'source' command as a list of commands executed in the current context:
$ source doit.sh

ПРИМЕЧАНИЕ. У меня были проблемы, когда grep не мог найти совпадение внутри файлов с кодировкой utf-16. Смотрите здесь для обхода. Если этот веб-сайт исчезает, вы используете флаг -a grep, который заставляет grep рассматривать файлы как текст и использовать шаблон регулярного выражения, который соответствует любому первому байту в каждом расширенном символе. Например, чтобы соответствовать Entité, сделайте это:

grep -a 'Entit.e'

и если это не сработает, попробуйте следующее:

grep -a 'E.n.t.i.t.e'
2 голосов
/ 09 июля 2014

Несмотря на безопасный ответ Мартина, если у вас есть уверенность в том, что вы хотите удалить, например, при написании сценария, я использовал this с большим успехом, чем любой другой однострочный, предложенный ранее. где-то здесь:

$ find . | grep -l email@domain.com | xargs -I {} rm -rf {}

Но я скорее нахожу по имени:

$ find . -iname *something* | xargs -I {} echo {}
1 голос
/ 06 августа 2017
rm -f `find . | xargs grep -li email@domain.com`

делает работу лучше.Используйте `...` для запуска команды, чтобы предложить имена файлов, содержащих электронную почту. @ Domain.com (grep -l перечисляет их, -i игнорирует регистр), чтобы удалить их с помощью rm (-f принудительно / -i интерактивно).

0 голосов
/ 14 марта 2016
find . | xargs grep -l email@domain.com

как убрать:

rm -f 'find . | xargs grep -l email@domain.com'
...