Итак, я использую grep на внешнем HDD
пример,
M:/
grep -rhI "bananas" . > out.txt
который выводит все строки в каталоге " M:/ ", содержащие " bananas "
Однако я хотел бы вывести все содержимое файла, так что если одна строка в example.txt содержит " bananas ", выведите все содержимое example.txt и то же самое касается любого другого .txt файла в каталоге " M:/ ", который содержит " bananas ".
grep -rlZI "bananas" . | xargs -0 cat > out.txt
-lZ
выводит список имен соответствующих файлов, разделенных нулем:
-l, --files-with-matches
Suppress normal output; instead print the name of each input
file from which output would normally have been printed. The
scanning will stop on the first match.
-Z, --null
Output a zero byte (the ASCII NUL character) instead of the
character that normally follows a file name. For example, grep
-lZ outputs a zero byte after each file name instead of the
usual newline. This option makes the output unambiguous, even
in the presence of file names containing unusual characters like
newlines. This option can be used with commands like find
-print0, perl -0, sort -z, and xargs -0 to process arbitrary
file names, even those that contain newline characters.
Если ваша версия grep не предоставляет -Z
, тогда вы можете вернуться к обычному -l
, который по-прежнему будет обрабатывать имена файлов, содержащие пробелы (очевидно, за исключением новой строки), если вы также установите разделитель xargs
на новую строку:
grep -rlI "bananas" . | xargs -d '\n' cat > out.txt
grep -r "бананы" | вырезать -d: -f1 | xargs cat >> result.txt
grep
-r
: рекурсивный. Рекурсивно прочитать все файлы в каждом каталоге,Результат: имя_файла:текст
для каждой строки. Например, foo.txt:бананы
.
Теперь нам нужно получить имя файла из каждой строки.
вырез
Простой редактор для удаления части строки (вы можете использовать sed
или awk
здесь, но вырезать просто)
-d
разделитель. Поскольку у нас есть :
после файла, это наш разделитель: -d:
-f
мы разделили наш вывод на поля. Какой взять? -f1
-- первый!xargs
Теперь у нас есть список файлов. Что делать с ними? Мы используем xargs
, который создает и выполняет командные строки из стандартного ввода. Он принимает имя файла на стандартный ввод и запускает cat
для каждой строки, предоставляя имя файла в качестве параметра. А cat
просто выводит свое содержимое на стандартный вывод.
>>
означает "добавить в файл"