Я знаю , что могу найти файлы с помощью find
: find . -type f -name 'sunrise'
. Пример результата:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
Я также знаю , что я могу определить тип файла файла: file sunrise
. Пример результата:
sunrise: PEM RSA private key
Но как я могу найти файлы по типу файла?
Например, my-find . -type f -name 'sunrise' -filetype=bash-script
:
./astronomy/sunrise
./schedule/sunrise
--filetype
опции для команды find или чего-либо еще, что сообщит вам тип файла. Единственное, что вы можете сделать, это использовать--exec file {} \;
и затем передать его,grep Bourne
если вы искали bash-скрипты, илиgrep Perl
вы искали Perl-скрипты или что-то в этом роде.Ответы:
«Типы файлов» в системе Unix - это такие вещи, как обычные файлы, каталоги, именованные каналы, специальные символьные файлы, символические ссылки и т. Д. Это типы файлов, которые
find
можно фильтровать с помощью этой-type
опции.find
Утилита не может сам по себе различию между «сценарием оболочкой», «файлом изображения JPEG» или любым другим типом обычного файла . Эти типы данных могут, однако, различатьсяfile
утилитой, которая просматривает конкретные сигнатуры в самих файлах, чтобы определить их тип.Распространенным способом маркировки файлов данных различных типов является их тип MIME , и
file
он может определить тип файла MIME.Используйте
file
с,find
чтобы обнаружить тип MIME обычных файлов, и используйте его только для поиска сценариев оболочки:или, используя
bash
,Добавьте
-name sunrise
перед,-exec
если вы хотите обнаруживать только сценарии с этим именем.Команда
find
выше найдет все обычные файлы в или ниже текущего каталога, и для каждого такого файла вызовите короткий встроенный скрипт оболочки. Этот сценарий выполняетсяfile -bi
для найденного файла и завершается с нулевым статусом выхода, если выходные данные этой команды содержат строку/x-shellscript
. Если вывод не содержит эту строку, он завершается с ненулевым состоянием выхода, что приводитfind
к немедленному продолжению работы со следующим файлом. Если файл оказался сценарием оболочки,find
команда продолжит выводить путь к файлу (-print
в конце, который также может быть заменен другим действием).Команда
file -bi
выведет MIME-тип файла. Для сценария оболочки в Linux (и большинстве других систем) это будет что-то вродев то время как в системах с более старым вариантом
file
утилиты, это может бытьОбщий бит - это
/x-shellscript
подстрока.Обратите внимание, что в macOS вам придется использовать
file -bI
вместоfile -bi
из-за причин (-i
опция делает что-то совсем другое). Вывод на macOS аналогичен выводу системы Linux.Вы хотели бы , чтобы выполнить некоторые пользовательские действия на каждом сценарии оболочки Found, вы могли бы сделать это с другой
-exec
на месте-print
вfind
командах выше, но также было бы возможно сделатьили, с
bash
,Связанные с:
источник
Вы можете выполнить
find
любой найденный файл, а затем выполнить grep для получения результата, который вас интересует.Я предлагаю сделать шаблон поиска максимально приближенным к вашим ожиданиям, чтобы количество ложных совпадений было низким.
Помните, что файлы с символами новой строки в именах файлов могут вызвать проблемы с этим подходом.
источник
Использование
perl
«sFile::LibMagic
модуля:источник