Dosya türüne göre dosyalar nasıl bulunur?


9

Ben kullanarak dosyaları bulabilirsiniz biliyorum find: find . -type f -name 'sunrise'. Örnek sonuç:

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

Ben de bir dosyanın dosya türünü belirlemek biliyoruz: file sunrise. Örnek sonuç:

sunrise: PEM RSA private key

Ancak dosyaları dosya türüne göre nasıl bulabilirim?

Örneğin my-find . -type f -name 'sunrise' -filetype=bash-script:

./astronomy/sunrise
./schedule/sunrise

1
Find --filetypekomutu veya size dosya türünü söyleyecek başka bir seçenek yoktur . Yapabileceğiniz tek şey kullanmak --exec file {} \;ve daha sonra grep Bournebash komut dosyaları grep Perlarıyorsanız ya da Perl komut dosyaları ya da bu satırlar boyunca bir şey arıyorsanız onu içine boru .
Nasir Riley

Yanıtlar:


13

Unix sistemindeki "dosya türleri" normal dosyalar, dizinler, adlandırılmış yöneltmeler, karakter özel dosyaları, sembolik bağlantılar vb. Öğelerdir. Bunlar seçeneği findile filtrelenebilen dosya türleridir-type .

Yardımcı findprogram kendi başına bir "kabuk betiği", "JPEG resim dosyası" veya başka herhangi bir normal dosya arasında ayrım yapamaz . Ancak bu veri türleri, türlerini filebelirlemek için dosyaların içindeki belirli imzalara bakan yardımcı program tarafından ayırt edilebilir .

Farklı veri dosyası türlerini etiketlemenin yaygın bir yolu, kendi MIME türleridir ve filebir dosyanın MIME türünü belirleyebilir.


Kullanımı fileile findMIME düzenli dosyaların türünü ve sadece kabuk komut dosyaları bulmak kullanımının tespit etmek için:

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

veya kullanarak bash,

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

Yalnızca bu ada sahip komut dosyalarını algılamak istiyorsanız -name sunriseönce ekleyin -exec.

Yukarıdaki findkomut, geçerli dizindeki veya altındaki tüm normal dosyaları bulur ve bu tür her dosya için kısa bir satır içi kabuk komut dosyası çağırır. Bu komut dosyası file -bibulunan dosyada çalışır ve bu komutun çıktısı dizeyi içeriyorsa sıfır çıkış durumuyla çıkar /x-shellscript. Çıktı bu dizeyi içermiyorsa, sıfırdan farklı bir çıkış durumuyla çıkar ve bu da bir findsonraki dosyayla hemen devam etmesine neden olur . Dosyanın bir kabuk komut dosyası olduğu tespit edilirse, findkomut dosyanın yol adını çıkarmaya devam eder ( -printsonunda başka bir eylemle de değiştirilebilecek olan).

file -biKomut çıktısı dosyanın MIME türü. Linux'ta (ve diğer birçok sistemde) bir kabuk komut dosyası için, bu

text/x-shellscript; charset=us-ascii

fileyardımcı programın biraz daha eski bir varyantına sahip sistemlerde ,

application/x-shellscript

Ortak bit /x-shellscriptalt dizedir.

MacOS üzerinde, kullanmak zorunda kalacağını Not file -bIyerine file -binedeniyle nedenlerle ( -iopsiyon oldukça farklı bir şey yapar). MacOS'taki çıktı bir Linux sistemininkine benzer.


Eğer başkasıyla bunu yapabilir, her bulunan kabuk senaryo üzerinde bazı özel eylemi gerçekleştirmek istediğiniz misiniz -execyerine -printde findyukarıdaki komutları, ama aynı zamanda yapmak mümkün olacaktır

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

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

İlişkili:


1

Sen exec olabilir findher Bulunan dosyayı ve ardından ilgilendiğiniz sonucu yakalamak için yazılması.

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

Yanlış pozitif eşleşmelerin sayısını düşük tutma beklentinizi olabildiğince yakın tutmanızı öneririm.

Dosya adlarında yeni satır içeren dosyaların bu yaklaşımla ilgili sorunlara neden olabileceğini unutmayın.


0

Kullanılması perl'nin File::LibMagicmodülü:

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' -- .
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.