"Типи файлів" в системі 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 або щось подібне.