Передача списка файлов в 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