«Типы файлов» в системе Unix - это такие вещи, как обычные файлы, каталоги, именованные каналы, специальные символьные файлы, символические ссылки и т. Д. Это типы файлов, которые find
можно фильтровать с помощью этой -type
опции.
find
Утилита не может сам по себе различию между «сценарием оболочкой», «файлом изображения JPEG» или любым другим типом обычного файла . Эти типы данных могут, однако, различаться file
утилитой, которая просматривает конкретные сигнатуры в самих файлах, чтобы определить их тип.
Распространенным способом маркировки файлов данных различных типов является их тип MIME , и file
он может определить тип файла MIME.
Используйте file
с, find
чтобы обнаружить тип MIME обычных файлов, и используйте его только для поиска сценариев оболочки:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
или, используя bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
Добавьте -name sunrise
перед, -exec
если вы хотите обнаруживать только сценарии с этим именем.
Команда find
выше найдет все обычные файлы в или ниже текущего каталога, и для каждого такого файла вызовите короткий встроенный скрипт оболочки. Этот сценарий выполняется file -bi
для найденного файла и завершается с нулевым статусом выхода, если выходные данные этой команды содержат строку /x-shellscript
. Если вывод не содержит эту строку, он завершается с ненулевым состоянием выхода, что приводит find
к немедленному продолжению работы со следующим файлом. Если файл оказался сценарием оболочки, find
команда продолжит выводить путь к файлу ( -print
в конце, который также может быть заменен другим действием).
Команда file -bi
выведет MIME-тип файла. Для сценария оболочки в Linux (и большинстве других систем) это будет что-то вроде
text/x-shellscript; charset=us-ascii
в то время как в системах с более старым вариантом file
утилиты, это может быть
application/x-shellscript
Общий бит - это /x-shellscript
подстрока.
Обратите внимание, что в macOS вам придется использовать file -bI
вместо file -bi
из-за причин ( -i
опция делает что-то совсем другое). Вывод на macOS аналогичен выводу системы Linux.
Вы хотели бы , чтобы выполнить некоторые пользовательские действия на каждом сценарии оболочки Found, вы могли бы сделать это с другой -exec
на месте -print
в find
командах выше, но также было бы возможно сделать
find . -type f -exec sh -c '
for pathname do
case $( file -bi "$pathname" ) in
*/x-shellscript*) ;;
*) continue
esac
# some code here that acts on "$pathname"
done' sh {} +
или, с bash
,
find . -type f -exec bash -c '
for pathname do
[[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue
# some code here that acts on "$pathname"
done' bash {} +
Связанные с:
--filetype
опции для команды find или чего-либо еще, что сообщит вам тип файла. Единственное, что вы можете сделать, это использовать--exec file {} \;
и затем передать его,grep Bourne
если вы искали bash-скрипты, илиgrep Perl
вы искали Perl-скрипты или что-то в этом роде.