Передача списка файлов в grep
У меня есть список файлов в файл. Список огромен, а имена файлов нестандартны: это означает, что у некоторых есть пробелы, символы не ascii, кавычки, одинарные кавычки ...
так, мимоходом, что огромный список файлов для grep в качестве аргументов не является опцией:
- потому что я не уверен, что не буду превышать длину аргументов, разрешенных в linux. Думаю, я могу решить эту проблему, разбив аргументы на
xargs
, хотя. - потому что избежать этих символов сложно. Если я хочу заключить имя файла в двойные кавычки, и у этого имени файла есть двойная кавычка, у меня проблемы. Поэтому мне нужно было бы избежать некоторых персонажей. Все это выглядит очень сложным, и я не хочу идти по этому пути.
должен быть более простой способ:как я могу сказать grep использовать мой список файлов в качестве файлов для grep? Я предполагаю, что, поскольку список файлов не будет обрабатываться оболочка, экранирование и длина аргумента больше не являются проблемой. Вопрос в том, поддерживает ли grep этот режим работы, который я не смог найти в документации.
1 ответов
GNU grep не поддерживает это, насколько я знаю. У вас есть несколько вариантов.
используйте цикл bash для анализа списка файлов
Это решение, предоставленное @fedorqui
while read file; do
grep "$PATTERN" "$file"
done < file_with_list_of_files
используйте xargs для передачи нескольких файлов grep сразу
здесь я сказал xargs передать 10 имен файлов grep
PATTERN='^$' # searching for blank lines
xargs -n 10 -d '\n' grep "$PATTERN" < file_with_list_of_files
используйте xargs для передачи нескольких файлов grep сразу, имея дело с новыми строками в имена
как указано выше, но с использованием нулевых строк
PATTERN='^$' # searching for blank lines
tr '\n' '' file_with_list_of_files
xargs -n 10 -0 grep "$PATTERN" < file_with_list_of_files
Edit: правильно обрабатывать пробелы Edit2: удалить пример, который производит искаженный вывод, добавьте пример, который имеет дело с newlines