Wiem, że mogę znaleźć plików za pomocą find
: find . -type f -name 'sunrise'
. Przykładowy wynik:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
Wiem też, że mogę określić typ pliku pliku: file sunrise
. Przykładowy wynik:
sunrise: PEM RSA private key
Ale jak mogę znaleźć pliki według typu pliku?
Na przykład my-find . -type f -name 'sunrise' -filetype=bash-script
:
./astronomy/sunrise
./schedule/sunrise
files
find
file-command
file-types
Strumień
źródło
źródło
--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.Odpowiedzi:
„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:lub, przy użyciu
bash
,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łafile -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 powodujefind
natychmiastowe kontynuowanie następnego pliku. Jeśli okaże się, żefind
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 podobnepodczas gdy w systemach z nieco starszym wariantem
file
narzędzia, może tak byćWspólnym bitem jest
/x-shellscript
podciąg.Zauważ, że w systemie macOS musiałbyś użyć
file -bI
zamiastfile -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
wfind
poleceniach powyżej, ale byłoby również możliwe do zrobienialub, z
bash
,Związane z:
źródło
Możesz wykonać
find
na każdym znalezionym pliku, a następnie grep dla wyniku, który Cię interesuje.Sugeruję, aby wzorzec wyszukiwania był jak najbardziej zbliżony do oczekiwań, aby utrzymać liczbę fałszywych trafień na niskim poziomie.
Uwaga: pliki z nowymi liniami w nazwach plików mogą powodować problemy z tym podejściem.
źródło
Korzystanie
perl
zFile::LibMagic
modułu:źródło