Использование только grep
достаточно:
grep -d skip -L '^- ' *
Примечание: В отличие от find
, это не будет автоматически включать скрытые файлы.
Чтобы найти рекурсивно, вместо этого используйте grep -L '^- ' -R .
(хотя -R
не совместим с POSIX, он работает как с GNU, так и с BSD/macOS grep
).
-L
, как описано в Jamil Said's helpful answer, печатает путь (как указано) каждого входного файла, который делает не содержать слово для поиска.
-d skip
пропуски каталогов (в то время как опция -d
не совместима с POSIX, поддерживается как GNU, так и BSD/macOS grep
).
Оговорка: Как hek2mgl точка в комментариях, командная строка, что приводит после расширения имени файла *
может быть слишком длинной, в результате ошибки, такие как /usr/bin/grep: Argument list too long
.
(В противоположность этому, если вы сделаете grep
поиск рекурсивно -R .
, вы не будете сталкиваться с этой проблемой.)
макс. длина конкретной платформы, и может быть запрошена с getconf ARG_MAX
, хотя отмечают, что фактический предел ниже чем, в зависимости от размера среды - см this article.
На практике 5000 файлов, вероятно, не будут проблемой, даже на платформах с относительно низким макс. длина, такая как macOS - если у вас нет исключительно длинных имен файлов и/или ваш шаблон подстановки имеет длинный компонент пути [1] .
Последние версии Linux имеют намного более высокий предел.
Если вы превысите предел и должны работать вокруг него, использования xargs
следующим образом:
printf '%s\0' * | xargs -0 grep -d skip -L '^- '
Обратите внимание, что в то время как -0
читать NUL заканчивающейся вход не POSIX-совместимый, это поддерживаемых как GNU, так и BSD/macOS xargs
.
Если входные имена файлов действительно не помещаются в командной строке одного, xargs
будет разметить вход таким образом, что приводит к наименьшим количеством grep
вызовов, необходимых для обработки всех из них.
[1] Macos 10.12 имеет предел 262,144
байт (256 КБ); если мы консервативно предположим, что после вычитания размера среды и фиксированной части командной строки мы получаем 250,000
байтов для нашего списка имен файлов, это дает нам 250000/5000 == 50
байт на каждое имя файла + пробел (разделитель списка), так что каждое имя файла разрешается до 49
байтов.
Напротив, предел Ubuntu 16.04 в 8 раз больше: 2,097,152
байт (2 МБ).
Что вы хотите достичь в конце? Отображать имена файлов, содержащие строку? – Inian
Показать файлы, которые НЕ соответствуют этому регулярному выражению. Это логический логический ИЛИ, который является точкой привязки. – Zhro