Hogyan lehet fájlokat találni fájltípus szerint?

Tudom, hogy a find: find . -type f -name "sunrise" fájlokat találom . Példa eredményre:

./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise 

Azt is tudom, hogy meg tudom határozni egy fájl fájltípusát: file sunrise. Példa eredményre:

sunrise: PEM RSA private key 

De hogyan találok fájlokat fájltípus szerint?

Például: my-find . -type f -name "sunrise" -filetype=bash-script:

./astronomy/sunrise ./schedule/sunrise 

megjegyzések

  • Nincs --filetype opció a find parancshoz, vagy bármi más, ami megmondja a fájl típusát. Az egyetlen dolog, amit tehet, az a, hogy használja a --exec file {} \; elemet, majd csatolja a grep Bourne fájlba, ha bash szkripteket keresett, vagy grep Perl ha Perl-szkripteket vagy valami hasonlót keresett.

Válasz

A “fájltípusok” egy Unix rendszeren olyan dolgok, mint a normál fájlok, könyvtárak, megnevezett csövek, karakteres speciális fájlok, szimbolikus linkek stb. Ezek a fájlok, amelyeket find a -type opcióval szűrni tud.

A find segédprogram önmagában nem képes megkülönböztetni egy “shell szkriptet”, “JPEG képfájlt” vagy bármely más rendes fájl típusát . Ezeket az adattípusokat azonban megkülönböztetheti a file segédprogram, amely maguknak a fájloknak az egyes aláírásait vizsgálja meg típusuk meghatározása érdekében.

A címkézés általános módja a különféle típusú adatfájlok MIME típusuk szerint , és file képesek meghatározni a fájl.


A file használata a find használatával a szokásos fájlok MIME-típusának felderítésére, és ezt használja csak shell parancsfájlok kereséséhez:

find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print 

vagy a bash használatával

find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print 

Add hozzá a -name sunrise elemet a -exec elé, ha csak az ilyen nevű parancsfájlokat akarod észlelni.

A fenti find parancs megtalálja az összes szokásos fájlt az aktuális könyvtárban vagy alatt, és minden ilyen fájlhoz meghív egy rövid soron belüli shell parancsfájlt. Ez a szkript file -bi futtatja a megtalált fájlon, és nulla kilépési állapottal lép ki, ha a parancs kimenete tartalmazza a /x-shellscript karakterláncot. Ha a kimenet nem tartalmazza ezt a karakterláncot, akkor nulla nélküli kilépési státusszal lép ki, ami miatt a find azonnal folytatódik a következő fájllal. Ha a fájlt shell parancsfájlnak találták, akkor a find parancs folytatja a fájl elérési útjának kiadását (a -print a vége, amelyet más művelettel is helyettesíthetünk).

A file -bi parancs kiadja a fájl MIME típusát. Linux rendszerű shell parancsfájl esetén ( és a legtöbb más rendszer), ez valami hasonló lehet

text/x-shellscript; charset=us-ascii 

, míg azoknál a rendszereknél, amelyeknél a file segédprogram, lehet, hogy

application/x-shellscript 

A közös bit a /x-shellscript alszöveg.

Ne feledje, hogy macOS rendszeren id ok miatt a file -bI -t kell használnia a file -bi helyett. A -i opció egészen mást csinál). A MacOS kimenete hasonló a Linux rendszeréhez.


Szeretne végrehajtani egyéni műveletet minden megtalált shell parancsfájlnál megteheti a th-t -nél egy másik -exec -nel a -print helyett a fenti find parancsokban, de ez

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 {} + 

vagy 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 {} + 

Kapcsolódó:

Válasz

Minden megtalált fájlra kiválaszthatja find majd fogd meg az érdeklődő eredményt.

# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word" 

Javaslom, hogy a keresési mintát a lehető legközelebb tegye az elvárásokhoz, hogy megtartsa a az álpozitivitás alacsony.

Vigyázzon, hogy a fájlnevekben új sorokkal rendelkező fájlok problémákat okozhatnak ezzel a megközelítéssel.

Válasz

A perl” s File::LibMagic modul használata:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük