Как grep текст рекурсивно на BusyBox 1.0?

Как найти файл, содержащий определенную строку в BusyBox 1.0, если grep -r не работает?

One Solution collect form web for “Как grep текст рекурсивно на BusyBox 1.0?”

find плюс grep

Комбинируйте find чтобы рекурсивно перемещать каталоги с помощью grep .

Если поддержка -print0 и -0 скомпилирована, вы можете использовать xargs для вызова grep для многих файлов одновременно¹:

 find /some/dir -type f -print0 | xargs -0 grep -H PATTERN 

Если ваши имена файлов ручные (без пробелов или \'" ), вам не нужно -print0 / -0 :

 find /some/dir -type f |xargs grep -H PATTERN 

Если у вас нет подходящих xargs , вам нужно будет вызывать grep для каждого имени файла отдельно:

 find /some/dir -type f -exec grep -H PATTERN {} \; 

Если вы find но у него нет -exec , и ваши имена файлов являются ручными (нет символов новой строки или \[*? ), И ваша оболочка поддерживает подстановки команд (например, ash и not hush), и их не так много файлы для рассмотрения, вы можете сгенерировать список имен файлов с помощью find и передать это как аргумент grep .

 set -f IFS=' ' grep PATTERN $(find /some/dir -type f) set +f 

Если файлов много, вы можете использовать цикл for всех файлов (по-прежнему только пепел из-за подстановки команды).

 set -f IFS=' ' for x in $(find /some/dir -type f); do grep -H PATTERN "$x" done set +f 

¹ No -exec … + на Busybox.

Без find

Если у вас нет find , это осложняется. Если у вашего Busybox есть зола и приличный test , вы можете написать рекурсивный обход каталога в оболочке.

 traverse () { d=$1; shift for x in "$d"/* "$d"/.[!.]* "$d"/..?*; do if test -f "$x"; then "$@" "$x" elif test -d "$x"; then traverse "$x" "$@" fi done } traverse /some/dir 

Но если у вас нет find , вы, вероятно, находитесь в очень ограниченной системе, где оболочка тишина, в которой отсутствуют функции. Вы можете имитировать функции с помощью eval . Я предполагаю, что у вас есть test ; если вы этого не сделаете, обнаружение каталогов возможно, но болезненно.

 command='grep -H PATTERN' traverse=' for x in "$d"/* "$d"/.[!.]* "$d"/..?*; do if test -f "$x"; then '"$command"' "$x" elif test -d "$x"; then d="$x" eval "$traverse" fi done ' d=/some/dir eval "$traverse" 
  • Найти и удалить все временные файлы в каталоге пользователя
  • Эффективный поиск уникальных владельцев файлов и каталогов
  • Сгладить вывод рекурсивного списка каталогов
  • Как загрузить все html-файлы из каталога URL с помощью wget?
  • Interesting Posts

    Есть ли какой-либо конкретный риск, связанный с использованием одного и того же пароля для кошельков root, kde и ключей?

    Невозможно получить доступ / root в CentOS-сервере с помощью «VSFTPD»

    Невозможно установить пакеты PHP в CentOS

    apt-rdepends не отображает многоархивую информацию

    Узнайте название интерфейса Linux

    bash prompt – длинный командный круг обратно в ту же строку после добавления цвета

    Не удалось получить доступ к Интернету после того, как ip статично в beaglebone black

    предотвращение перезаписи символики udev

    Как публиковать несколько IP-адресов, принадлежащих разным интерфейсам одного и того же устройства, через Avahi Daemon?

    Может ли командная команда linux обрабатывать кодированные текстовые файлы UTF-8?

    Как bash изменяет экологические переменные на лету?

    Удаленный вход в GUI с Windows-машины на Linux-машину

    Изменение постоянной таблицы маршрутизации

    Социальный сайт о командах оболочки

    Как я могу «кэшировать» переменную в Bash?

    Linux и Unix - лучшая ОС в мире.