Bir dizinde bulunan tüm dosya türlerini nasıl gösterebilirim?


12

Belirli bir dizinde hangi tür dosyaların bulunduğunu söyleyen bir komut var mı?

Gibi bir komut kullanarak dosya türünü bulabilirim od -c myfile | less.

Ama bir dizindeki tüm dosyalar için nasıl yapılacağını bilmiyorum.

Yanıtlar:


19

od -cBir dosyanın içeriğini gerçekten göstermesine rağmen , dosya türünü almanın iyi bir yolu değildir. Bazı dosyalar dosya türüne sahip bir başlık içermekle birlikte, tümü içermez. Daha iyi bir yol komuttur file:

$ echo "hello" > foo.txt
$ file foo.txt
foo.txt: ASCII text

Bu nedenle, bir dizindeki tüm dosya türlerinin bir listesini almak için şunları yapabilirsiniz:

for file in dir/*; do file "$file" | cut -d: -f 2; done | sort -u

Örnek çıktı:

 PNG image data, 1500 x 500, 8-bit/color RGBA, non-interlaced
 ASCII text
 directory
 GIF image data, version 89a, 22 x 22
 ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=becf821e4d814fdb69306d0b3f686eb06992f5e5, stripped

açıklama

  • for file in dir/*; do ... done;: her öğeyi yineleyin dir( diryalnızca bir örnektir, bunu aramak istediğiniz gerçek dizinin adıyla değiştirmeniz gerekir), her öğeyi sırayla kaydederek$file
  • file "$file": filebulunan öğelerin her birinde çalışır .
  • cut -d: -f 2: yalnızca ikinci alanı yazdır (ile tanımlanan alanlar :)
  • sed 's/^ //; s/ +/ /g' : satırın başından boşlukları kaldırır ve ardışık boşlukları tek bir boşluğa dönüştürür.
  • sort -u : yinelenen dosya türlerini kaldır

teşekkürler, Ama tam olarak kopyalayın ve geçmiş "dir / * dosya için dosya; do" $ dosya "| cut -d: -f 2 | sort -u; bitti" benim terminal ve "HATA" var
Mohammad Reza Rezwani

2
@alex her şeyden önce, lütfen her zaman aldığınız hatayı belirtin, "HATA" nın çok yararlı olmadığını söyleyerek. Her durumda, hata büyük olasılıkla adlandırılmış bir dizininiz olmadığı için dir/, bu sadece bir örnek addı, bunu gerçek bir dizinin adıyla değiştirmeniz gerekir: for file in /home/alex/*; do ... doneörneğin.
terdon

teşekkürler, eğer yanlış işimi yaptıysanız (... Ben dir dizin gibi komut olduğunu düşündüm -sorry- Ayrıca cevabınızı düzenlemek için daha iyi düşünüyorum) Sadece "HATA" ve başka bir şey görmek.
Mohammad Reza Rezwani

iyi iş, thnaks, ama ben dört satır gördüm "ID3 sürüm 2.3.0 ile ses dosyası," veya birden fazla "ISO Medya, MPEG v4 sistemi, sürüm 2" içerir. "Yinelenen kaldırma" konusunda emin değilim.
Mohammad Reza Rezwani

@alex yeterince adil, cevap düzenlendi. Hiçbir kopya almamanız gerekir. sort -uHatlar farklı olmalıdır, bunları kaldırır (aynı zamanda boşluk bölgesinin farklı bir sayıda olabilir, bu onların aynı olmayan hale getirir).
terdon

3

Muhtemelen böyle bir şey yapardım -

find . -type f -exec file {}  \;

Bu, geçerli yoldan dosyaları arar (örn. Dizin yok) ve sonra fileher dosyada komutu yürütür .


1

Bunu dene:

ls | xargs file -b | sort | uniq

Nasıl çalışır:

ls : dizin içeriğini listele

dosya -b : dosya türünü belirler; çıktı adlarının önüne dosya adları eklemeyin

sort : satırları sırala

uniq : tekrarlanan satırları atla



1
Ayrıştırmayı önlemek için file -b *yerine kullanabilirsiniz . ls | xargs file -bls
wjandrea
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.