Проверить чтобы убедиться, что ни одна из папок в / long / backup / folder / name
не смонтирована в / home / mirthen
. Вы можете застрять в рекурсивном цикле!
Оболочка не умеет вызывать grep
при слишком большом количестве файлов, вернее, длина командной строки 1 для вызова внешней утилиты имеет предел, и вы его нажимаете, когда оболочка пытается вызвать grep
с расширенным шаблоном подстановки cdr/173/07/cdr_2018_07*
.
Что вы можете сделать, так это выполнить поиск каждого файла по отдельности с помощью
for pathname in cdr/173/07/cdr_2018_07*; do
grep "IP" "$pathname" /dev/null
done
где дополнительный /dev/null
заставит grep
всегда сообщать имя файла, который соответствует, или вы можете использоватьfind
:
find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
-exec grep "IP" /dev/null {} +
, который будет более эффективным, поскольку grep
будет вызываться с максимально возможным количеством совпадающих путей в пакетах.
Также может быть, что если вы сначала cd
в cdr/173/07
и выполните
grep "IP" cdr_2018_07*
это может работать, так как сгенерированный список имен файлов будет короче из-за того, что он не содержит битов каталога, но вы, вероятно, очень близки к пределу с файлами размером 44,7 КБ, и вам следует серьезно подумать о переходе на другой способ сделать это, особенно если вы ожидаете, что количество файлов будет колебаться вокруг этого числа.
Связанные:
Другие вопросы по U&L, касающиеся «слишком длинного списка аргументов»
1Ограничение на общую длину командной строки и длину среды среды(сумму длины каждого аргумента и имени и значения переменной среды, а также с учетом указателей для них ), и это ограничение, налагаемое системным вызовом execve()
, который используется оболочкой для выполнения внешних команд. Встроенная -в таких командах, как echo
и т. д., не имеет этой проблемы.
Я отвечаю на вопрос на основе нижеуказанных пунктов :-Есть два каталога :-1 )cdr/173/07 2 )cdr/173/06
В этих двух каталогах может быть много файлов, в которых мне нужно искать
a )Ниже приведено первое решение
grep -r "IP" cdr/173/07 -e "IP" cdr/173/06
b )Но если есть много других каталогов, в которых вы хотите выполнить поиск, вы можете использовать
grep -r "IP" cdr/173/*
c )Предположим, у нас есть 1000 файлов, и мы хотим искать только определенные типы файлов. grep -r "IP" cdr/173/07/cdr _2018 _07*-e grep "IP" cdr/173/06/cdr _2018 _06*
Проблема заключается в максимальном разрешенном количестве байтов в команде оболочки.
*
расширяется до общего списка всех файлов в каталоге, поэтому важен не размер файла, а длина имен файлов и количество файлов.
Вы можете получить ограничение вашей машины в байтах, запустив $ getconf ARG_MAX
. Обратите внимание, что это ограничение накладывается ОС/ядром, а не самой оболочкой.
Чтобы обойти это, используйте find:
$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;