Tiedän, että löydän tiedostoja käyttämällä find
: find . -type f -name "sunrise"
. Esimerkkitulos:
./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise
Tiedän myös, että voin määrittää tiedoston tiedostotyypin: file sunrise
. Esimerkkitulos:
sunrise: PEM RSA private key
Mutta miten löydän tiedostot tiedostotyypin mukaan?
Esimerkiksi my-find . -type f -name "sunrise" -filetype=bash-script
:
./astronomy/sunrise ./schedule/sunrise
kommentit
Vastaa
”Tiedostotyypit” Unix-järjestelmässä ovat esimerkiksi tavalliset tiedostot, hakemistot, nimetyt putket, merkkikohtaiset tiedostot, symboliset linkit jne. Nämä ovat tiedostot, jotka find
voivat suodattaa -type
-vaihtoehdolla.
find
-apuohjelma ei voi itsessään erottaa ”komentosarjaa”, ”JPEG-kuvatiedostoa” tai muuta tavallisen tiedoston tyyppiä . Tämäntyyppiset tiedot voidaan kuitenkin erottaa file
-apuohjelman avulla, joka etsii tiedostojen tiettyjä allekirjoituksia itse tyypin määrittämiseksi.
Yleinen tapa tunnistaa erityyppiset datatiedostot ovat MIME-tyypin mukaan ja file
pystyy määrittämään MIME-tyypin tiedosto.
file
-toiminnon käyttäminen find
-toiminnon avulla tavallisten tiedostojen MIME-tyypin havaitsemiseksi ja käytä sitä vain shell-komentosarjojen löytäminen:
find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print
tai käyttämällä bash
,
find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print
Lisää -name sunrise
ennen -exec
-merkkiä, jos haluat havaita vain tällä nimellä varustetut komentosarjat.
Yllä oleva find
-komento löytää kaikki tavalliset tiedostot nykyisestä hakemistosta tai sen alapuolelta, ja kutsu jokaiselle tällaiselle tiedostolle lyhyt rivin sisäinen komentosarja. Tämä komentosarja suorittaa file -bi
löydetyssä tiedostossa ja poistuu nollan poistumistilasta, jos komennon lähtö sisältää merkkijonon /x-shellscript
. Jos lähtö ei sisällä kyseistä merkkijonoa, se poistuu nollasta poikkeavalla poistumistilalla, mikä aiheuttaa find
-toiminnon jatkamisen välittömästi seuraavalla tiedostolla. Jos tiedoston todettiin olevan komentotulkkikomento, komento find
tuottaa tiedoston polun nimen (-print
loppu, joka voidaan myös korvata jollakin muulla toiminnolla).
file -bi
-komento antaa tiedoston MIME-tyypin. ja useimmat muut järjestelmät), tämä olisi jotain
text/x-shellscript; charset=us-ascii
kun taas järjestelmissä, joissa on hieman vanhempi file
apuohjelma, se voi olla
application/x-shellscript
Yleinen bitti on /x-shellscript
-alimerkkijono.
Huomaa, että MacOS: ssa sinun on käytettävä file -bI
file -bi
-kohdan sijaan syistä ( -i
-vaihtoehto tekee jotain aivan erilaista). MacOS: n lähtö on samanlainen kuin Linux-järjestelmän.
Haluatko suorittaa mukautetun toiminnon jokaisessa löydetyssä komentosarjassa voit tehdä th at toisella -exec
-print
: n sijasta yllä olevissa find
-komennoissa, mutta olisi myös mahdollista tehdä
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 {} +
tai bash
kanssa
find . -type f -exec bash -c " for pathname do [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue # some code here that acts on "$pathname" done" bash {} +
Aiheeseen liittyvät:
vastaus
Voit suorittaa find
jokaiselle löydetylle tiedostolle ja napauta sitten sinua kiinnostavaa tulosta.
# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word"
Ehdotan, että hakukuvio tehdään mahdollisimman lähelle odotustasi pitääksesi hakumäärä väärät positiiviset vastaavuudet ovat vähäiset.
Varo, että tiedostot, joiden tiedostonimissä on riviviivoja, voivat aiheuttaa ongelmia tässä lähestymistavassa.
Vastaa
perl
” s File::LibMagic
-moduulin käyttäminen:
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" -- .
--exec file {} \;
ja liittää se sittengrep Bourne
, jos etsit bash-komentosarjoja taigrep Perl
jos etsit Perlin komentosarjoja tai jotain näiden linjojen mukaisesti.