„Typy plików” w systemie Unix to takie rzeczy, jak zwykłe pliki, katalogi, nazwane potoki, specjalne znaki postaci, dowiązania symboliczne itp. Są to typy plików, które find
można filtrować za pomocą tej -type
opcji.
find
Narzędzie nie może być sama odróżnić „shell script”, „plik obrazu JPEG” lub jakiegokolwiek innego rodzaju zwykłego pliku . Tego typu dane można jednak rozróżnić za pomocą file
narzędzia, które sprawdza określone podpisy w samych plikach, aby określić ich typ.
Typowym sposobem oznaczania różnych typów plików danych jest ich typ MIME i file
jest on w stanie określić typ MIME pliku.
Używanie file
za pomocą find
do wykrywania zwykłych plików typu MIME i używanie go do wyszukiwania tylko skryptów powłoki:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
lub, przy użyciu bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
Dodaj -name sunrise
przed, -exec
jeśli chcesz wykrywać tylko skrypty o tej nazwie.
Powyższe find
polecenie znajdzie wszystkie zwykłe pliki w bieżącym katalogu lub poniżej niego i dla każdego takiego pliku wywołuje krótki skrypt powłoki. Ten skrypt działa file -bi
na znalezionym pliku i kończy działanie z zerowym statusem wyjścia, jeśli dane wyjściowe tego polecenia zawierają ciąg /x-shellscript
. Jeśli dane wyjściowe nie zawierają tego ciągu, kończy działanie z niezerowym statusem wyjścia, co powoduje find
natychmiastowe kontynuowanie następnego pliku. Jeśli okaże się, że find
plik jest skryptem powłoki, polecenie przejdzie do wypisania nazwy pliku ( -print
na końcu, którą można również zastąpić inną czynnością).
file -bi
Wyjście komenda typ MIME pliku. W przypadku skryptu powłoki w systemie Linux (i większości innych systemów) byłoby to podobne
text/x-shellscript; charset=us-ascii
podczas gdy w systemach z nieco starszym wariantem file
narzędzia, może tak być
application/x-shellscript
Wspólnym bitem jest /x-shellscript
podciąg.
Zauważ, że w systemie macOS musiałbyś użyć file -bI
zamiast file -bi
z powodów ( -i
opcja robi coś zupełnie innego). Dane wyjściowe w systemie macOS są podobne do wyników w systemie Linux.
Czy chcesz przeprowadzić jakąś akcję niestandardową na każdym skrypcie znaleziony, można to zrobić z innego -exec
w miejsce -print
w find
poleceniach powyżej, ale byłoby również możliwe do zrobienia
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 {} +
lub, z 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 {} +
Związane z:
--filetype
opcji dla polecenia find ani czegokolwiek innego, co powie ci o typie pliku. Jedyne, co możesz zrobić, to użyć,--exec file {} \;
a następnie wpakować do niego,grep Bourne
jeśli szukasz skryptów bash lubgrep Perl
jeśli szukasz skryptów Perla lub czegoś podobnego.