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
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" -- .
--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 agrep Bourne
fájlba, ha bash szkripteket keresett, vagygrep Perl
ha Perl-szkripteket vagy valami hasonlót keresett.