grep работает с одним filepath, не другой

Проверить чтобы убедиться, что ни одна из папок в / long / backup / folder / name не смонтирована в / home / mirthen . Вы можете застрять в рекурсивном цикле!

0
01.08.2018, 18:59
3 ответа

Оболочка не умеет вызывать 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 КБ, и вам следует серьезно подумать о переходе на другой способ сделать это, особенно если вы ожидаете, что количество файлов будет колебаться вокруг этого числа.

Связанные:


1Ограничение на общую длину командной строки и длину среды среды(сумму длины каждого аргумента и имени и значения переменной среды, а также с учетом указателей для них ), и это ограничение, налагаемое системным вызовом execve(), который используется оболочкой для выполнения внешних команд. Встроенная -в таких командах, как echoи т. д., не имеет этой проблемы.

6
28.01.2020, 02:14

Я отвечаю на вопрос на основе нижеуказанных пунктов :-Есть два каталога :-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*

0
28.01.2020, 02:14

Проблема заключается в максимальном разрешенном количестве байтов в команде оболочки.

*расширяется до общего списка всех файлов в каталоге, поэтому важен не размер файла, а длина имен файлов и количество файлов.

Вы можете получить ограничение вашей машины в байтах, запустив $ getconf ARG_MAX. Обратите внимание, что это ограничение накладывается ОС/ядром, а не самой оболочкой.

Чтобы обойти это, используйте find:

$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;

1
28.01.2020, 02:14

Теги

Похожие вопросы