Vím, že mohu najít soubory pomocí find
: find . -type f -name "sunrise"
. Příklad výsledku:
./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise
Také vím, že mohu určit typ souboru souboru: file sunrise
. Příklad výsledku:
sunrise: PEM RSA private key
Jak ale mohu najít soubory podle typu souboru?
Například my-find . -type f -name "sunrise" -filetype=bash-script
:
./astronomy/sunrise ./schedule/sunrise
Komentáře
Odpovědět
„Typy souborů“ v systému Unix jsou věci jako běžné soubory, adresáře, pojmenované kanály, speciální soubory znaků, symbolické odkazy atd. Jedná se o typ soubory, které find
mohou filtrovat pomocí možnosti -type
.
find
nedokáže sám rozlišit mezi „skriptem shellu“, „souborem obrázku JPEG“ nebo jakýmkoli jiným typem běžného souboru . Tyto typy dat však lze odlišit pomocí nástroje file
, který pro určení jejich typu zkoumá konkrétní podpisy v samotných souborech.
Běžný způsob označování různé typy datových souborů jsou podle jejich typu MIME a file
je schopen určit typ MIME soubor.
Pomocí file
s find
detekovat typ MIME běžných souborů a použít jej najít pouze skripty prostředí:
find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print
nebo pomocí bash
,
find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print
Přidejte -name sunrise
před -exec
, pokud si přejete detekovat pouze skripty s tímto názvem.
Příkaz find
výše najde všechny běžné soubory v aktuálním adresáři nebo pod ním a pro každý takový soubor zavolá krátký in-line shell skript. Tento skript běží file -bi
na nalezeném souboru a končí s nulovým stavem ukončení, pokud výstup tohoto příkazu obsahuje řetězec /x-shellscript
. Pokud výstup tento řetězec neobsahuje, ukončí se s nenulovým stavem ukončení, což způsobí, že find
bude okamžitě pokračovat s dalším souborem. Pokud byl soubor shledán jako shell skript, příkaz find
přenese cestu k souboru (-print
na konec, který by mohl být také nahrazen nějakou jinou akcí).
Příkaz file -bi
vygeneruje typ souboru MIME. Pro skript prostředí Linux ( a většina ostatních systémů) by to bylo něco jako
text/x-shellscript; charset=us-ascii
zatímco v systémech s mírně starší variantou file
, může to být
application/x-shellscript
Společným bitem je /x-shellscript
podřetězec.
Uvědomte si, že v systému macOS budete muset použít file -bI
místo file -bi
z důvodů ( Možnost -i
dělá něco úplně jiného). Výstup v systému macOS je podobný jako v systému Linux.
Chcete provést nějakou vlastní akci na každém nalezeném shell skriptu můžete udělat th at s jiným -exec
místo -print
v find
výše uvedených příkazech, ale je bylo by také možné udělat
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 {} +
nebo s 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 {} +
Související:
Odpověď
Můžete spustit find
na každém nalezeném souboru a poté pozdravte výsledek, který vás zajímá.
# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word"
Navrhuji, aby se vyhledávací vzor co nejvíce přiblížil vašemu očekávání, aby se zachoval počet falešný poplach odpovídá nízké hodnotě.
Pozor, soubory s novými řádky v názvech souborů mohou s tímto přístupem způsobovat problémy.
Odpovědět
Používání perl
“ s File::LibMagic
modulu:
perl -MFile::LibMagic=:easy -MFile::Find -le " find sub { print $File::Find::name if $_ eq "sunrise" and -f and MagicFile$_ eq "PEM RSA private key" }, @ARGV" -- .
--filetype
volba pro příkaz find nebo cokoli jiného, co vám řekne typ souboru. Jediná věc, kterou můžete udělat, je použít--exec file {} \;
a poté jej převést dogrep Bourne
, pokud hledáte bash skripty nebogrep Perl
pokud hledáte skripty Perl nebo něco podobného.