Bagaimana saya bisa menampilkan semua tipe file yang terdapat dalam direktori?

12

Apakah ada perintah yang memberi tahu saya dalam direktori spesifik jenis file yang ada?

Saya bisa mengetahui tipe file dengan menggunakan perintah like od -c myfile | less.

Tapi saya tidak tahu bagaimana melakukannya untuk semua file dalam direktori.

Mohammad Reza Rezwani
sumber

Jawaban:

19

Meskipun od -cmemang akan menampilkan konten file, itu bukan cara yang baik untuk mendapatkan jenis file. Sementara beberapa file akan berisi header dengan tipe file, tidak semua akan. Cara yang lebih baik adalah perintah file:

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

Jadi, untuk mendapatkan daftar semua jenis file dalam direktori, Anda dapat melakukan:

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

Contoh output:

 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

Penjelasan

  • for file in dir/*; do ... done;: iterate through everything in dir( dirhanya sebuah contoh, Anda harus mengubahnya ke nama direktori aktual yang ingin Anda cari), menyimpan setiap item pada gilirannya sebagai$file
  • file "$file": jalankan filedi setiap item yang ditemukan.
  • cut -d: -f 2: hanya cetak bidang kedua (bidang yang ditentukan oleh :)
  • sed 's/^ //; s/ +/ /g' : hapus spasi dari awal baris dan konversi spasi berurutan menjadi satu ruang.
  • sort -u : hapus jenis file duplikat
terdon
sumber
terima kasih, Tapi aku benar-benar menyalin dan melewati "untuk file dalam dir / *; lakukan file" $ file "| cut -d: -f 2 | sort -u; selesai" di terminal saya dan saya mendapat "KESALAHAN"
Mohammad Reza Rezwani
2
@ alex pertama-tama, harap selalu menyebutkan kesalahan yang Anda dapatkan, mengatakan bahwa Anda mendapat "KESALAHAN" tidak terlalu berguna. Bagaimanapun, kesalahan itu mungkin karena Anda tidak memiliki direktori bernama dir/, itu hanya nama contoh, Anda perlu mengubahnya ke nama direktori nyata: for file in /home/alex/*; do ... donemisalnya.
terdon
terima kasih, Jika Anda melakukan pekerjaan saya yang salah (... Saya pikir dir adalah perintah seperti ls bukan direktori -lalu- juga saya pikir lebih baik untuk mengedit jawaban Anda) Anda hanya melihat "KESALAHAN" dan tidak ada yang lain.
Mohammad Reza Rezwani
kerja bagus, thnaks, tapi saya melihat misalnya empat baris "file Audio dengan ID3 versi 2.3.0, berisi" atau lebih dari satu "Media ISO, sistem MPEG v4, versi 2". Saya tidak yakin tentang "hapus duplikat".
Mohammad Reza Rezwani
@ Alex cukup adil, jawabannya diedit. Anda seharusnya tidak mendapatkan duplikat. The sort -uakan menghapusnya, garis harus berbeda (mereka mungkin juga memiliki nomor yang berbeda dari ruang, yang membuat mereka non-identik).
terdon
3

Saya mungkin akan melakukan sesuatu seperti ini -

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

Itu akan mencari dari jalur saat ini, untuk file (misalnya tidak ada direktori) dan kemudian jalankan fileperintah pada setiap file.

Elliott Frisch
sumber
1

Coba ini:

ls | xargs file -b | sort | uniq

Bagaimana itu bekerja:

ls : daftar isi direktori

file -b : tentukan jenis file; jangan tambahkan nama file ke baris keluaran

sort : sort lines

uniq : hapus baris yang diulang

Wolfy
sumber
1
Anda bisa menggunakan file -b *alih-alih ls | xargs file -b, untuk menghindari penguraian ls.
wjandrea