Мне понравилось решение Мартина Беккета, но я обнаружил, что имена файлов с пробелами могут запутать его (например, кто использует пробелы в именах файлов, 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'