Kuinka löytää tiedostot tiedostotyypin mukaan?

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

  • vaihtoehto hakukomennolle tai muulle, joka kertoo sinulle tiedostotyypin. Ainoa mitä voit tehdä, on käyttää --exec file {} \; ja liittää se sitten grep Bourne, jos etsit bash-komentosarjoja tai grep Perl jos etsit Perlin komentosarjoja tai jotain näiden linjojen mukaisesti.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *