Jak najít soubory podle typu souboru?

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

  • Neexistuje žádný --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 do grep Bourne, pokud hledáte bash skripty nebo grep Perl pokud hledáte skripty Perl nebo něco podobného.

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" -- . 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *