Удаление файлов со строкой, найденной в файле - linux cli
Я пытаюсь удалить ошибочные электронные письма на основе поиска адреса электронной почты в файле через CLI Linux.
Я могу получить файлы с помощью
find . | xargs grep -l [email protected]
Но я не могу понять, как удалить их оттуда, поскольку следующий код не работает.
rm -f | xargs find . | xargs grep -l [email protected]
Благодарим вас за помощь.
Ответы
Ответ 1
В целях безопасности я обычно выводю вывод из find на что-то вроде awk и создаю командный файл с каждой строкой: "rm filename"
Таким образом, вы можете проверить его, прежде чем запускать его, и вручную исправить любые случаи нечетного края, которые трудно сделать с регулярным выражением
find . | xargs grep -l [email protected] | awk '{print "rm "$1}' > doit.sh
vi doit.sh // check for murphy and his law
source doit.sh
Ответ 2
@Мартин Беккет опубликовал отличный ответ, пожалуйста, следуйте этому руководству
для вашей команды:
grep -l [email protected] * | xargs rm
или
for file in $(grep -l [email protected] *); do
rm -i $file;
# ^ prompt for delete
done
Ответ 3
Вы можете использовать find
-exec
и -delete
, он удалит только файл, если команда grep
будет успешной. Используя grep -q
, чтобы он ничего не печатал, вы можете заменить -q
на -l
, чтобы увидеть, какие файлы имеют в них строку.
find . -exec grep -q '[email protected]' '{}' \; -delete
Ответ 4
Несмотря на безопасный ответ Мартина, если у вас есть уверенность в том, что вы хотите удалить, например, при написании script, я использовал this с большим успехом, чем любой другой лайнер, предложенный здесь:
$ find . | grep -l [email protected] | xargs -I {} rm -rf {}
Но я скорее найду по имени:
$ find . -iname *something* | xargs -I {} echo {}
Ответ 5
find . | xargs grep -l [email protected]
как удалить:
rm -f 'find . | xargs grep -l [email protected]'
Ответ 6
rm -f `find . | xargs grep -li [email protected]`
делает работу лучше. Используйте `...` для запуска команды, чтобы предлагать имена файлов, содержащие электронную почту. @Domain.com(grep -l перечисляет их, -i игнорирует случай), чтобы удалить их с помощью rm (-f принудительно /-i в интерактивном режиме).
Ответ 7
Мне понравилось решение Martin Beckett, но обнаружил, что имена файлов с пробелами могут его отключить (например, кто использует пробелы в именах файлов, 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.
См. здесь для обходного пути. В случае, если веб-сайт исчезнет, вы используете флаг grep -a, который делает файлы grep обработаны как текст и использует шаблон регулярного выражения, который соответствует любому первому байту в каждом расширенном символе. Например, чтобы соответствовать Entité, выполните следующие действия:
grep -a 'Entit.e'
и если это не сработает, попробуйте следующее:
grep -a 'E.n.t.i.t.e'