Я хочу искать рекурсивно определенное слово, сказать MyWord, но я хочу распечатать все содержание всех файлов, которые содержат MyWord. Как я делаю это?
Оказывается, что я особенно забочусь о двоичном файле sqlite о файлах, и захват их и чтение результата как текстовый файл, а не двоичный файл.
Если ваша папка не такая большая, попробуйте:
grep -rz '.*MyWord.*' myfolder > output
при необходимости добавьте -a
Я использовал бы:
sudo grep -rIlZ --exclude=${HISTFILE##*/} --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'MyWord' | xargs -0 cat > MyOutputFile
sudo
не смотря в системных каталогах.'/'
к текущему каталогу '.'
или определенный каталог т.е. '/home/me/stuff'
mnt
включать файлы Windows, смонтированные под mnt
.lib
включать исходные файлы Linux--exclude=${HISTFILE##*/}
необходимо, если Вы выполняете команду во второй раз или если строка поиска MyWord
когда-либо использовался в другой команде прежде. Это предотвращает 5 тысяч строк истории ($HISTFILE) от того, чтобы быть включенным.-r
рекурсивный, I
пропустите двоичные файлы, lZ
производит нулевой байт после каждого имени файла вместо обычной новой строки. Пустой указатель (обнуляют байт), разделители, необходимые для perl -0
, sort -z
и xargs
привыкший к cat
(распечатайте) содержание файла.> MyOutputFile
отправляет вывод в файл вместо экрана. Оставьте это для выведенного на экран.Примечание: Отсутствие от вывода является именем файла, просто содержание файла перечислено.
Можно также использовать find
с grep
:
find . -type f -exec grep -wq 'MyWord' {} \; -exec cat {} >> /path/to/outfile \;
Это найдет файлы, содержащие слово "MyWord" рекурсивно и вполне как только первое соответствие, найденное затем, перенаправляет целое содержание файла в новый файл.