Как с помощью Busybox выполнить рекурсивный поиск выражения в группе файлов по нескольким каталогам, но при этом просматривать только текстовые файлы?
Мы не знаем, каким будет суффикс файла; это может быть .sh, это может быть ничего, это может быть что-то еще. Я думал как-то основывать поиск на кодировке, хотя я также не совсем уверен, какой будет кодировка.
Я пробовал busybox grep -r
, но он ищет и в двоичных файлах, что отнимает много времени.
решение1
grep
поддерживает возможность --binary-files
обработки двоичных файлов как binary
, text
или without-match
. Последняя опция должна пропускать двоичные файлы. Это эквивалентно grep -I
. Я провел тест, и похоже, что Busybox grep
поддерживает -I
пропуск двоичных файлов.
grep
не «магически» определяет, является ли файл двоичным или текстовым: он просто проверяет первые несколько байтов, чтобы увидеть, являются ли они текстом или нет, и предполагает то же самое для остальной части файла (согласно man grep
).
Замечания: можно эмулировать это, например, сравнивая, если head -1 myfile
файл равен head -1 myfile | strings
. Если file
доступно, то оно еще более надежно, но его нет в Busybox, и, скорее всего, его нет в системе, если Busybox используется в основном.
решение2
В чем разница между двоичным файлом со структурой
struct MyBin
{
byte a;
byte b;
byte c;
}
с ценностями
myBin.a = 70;
myBin.b = 111;
myBin.c = 111;
А текстовый файл с текстом Foo
?
Текстовый файл — это всего лишь двоичный файл, который вы интерпретируете с помощью специальных кодов поиска, называемых кодировками символов (ASCII, UTF-8 и т. д.). Поэтому нет простого способа отличить «двоичные файлы» от «текстовых файлов».
Возможно, есть способ исключить файлы, у которых установлен бит выполнения, или искать только файлы с размером меньше определенного (сомневаюсь, что ваш текстовый файл превышает 1 МБ), но у меня недостаточно знаний о том, как фильтровать результаты grep, чтобы привести пример того, как это сделать.