Làm thế nào tôi có thể hiển thị tất cả các loại tệp có trong một thư mục?


12

Có lệnh nào cho tôi biết trong thư mục cụ thể loại tệp nào tồn tại không?

Tôi có thể tìm ra loại tệp bằng cách sử dụng một lệnh như od -c myfile | less.

Nhưng tôi không biết làm thế nào để làm điều đó cho tất cả các tệp trong một thư mục.

Câu trả lời:


19

Mặc dù od -cthực sự sẽ hiển thị nội dung của một tệp, nhưng nó không phải là một cách tốt để có được loại tệp của nó. Mặc dù một số tệp sẽ chứa một tiêu đề với loại tệp, nhưng không phải tất cả sẽ. Một cách tốt hơn là lệnh file:

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

Vì vậy, để có được danh sách tất cả các loại tệp trong một thư mục, bạn có thể làm:

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

Ví dụ đầu ra:

 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

Giải trình

  • for file in dir/*; do ... done;: lặp qua tất cả mọi thứ trong dir( dirchỉ là một ví dụ, bạn nên thay đổi tên này thành tên của thư mục thực tế bạn muốn tìm kiếm), lần lượt lưu từng mục$file
  • file "$file": chạy filetrên từng mục được tìm thấy.
  • cut -d: -f 2: chỉ in trường thứ hai (các trường được xác định bởi :)
  • sed 's/^ //; s/ +/ /g' : xóa khoảng trắng từ đầu dòng và chuyển đổi các khoảng trắng liên tiếp thành một khoảng trắng.
  • sort -u : loại bỏ các loại tệp trùng lặp

cảm ơn, nhưng tôi đã sao chép chính xác và quá khứ "cho tệp trong dir / *; làm tệp" $ file "| cut -d: -f 2 | sort -u; xong" trong thiết bị đầu cuối của tôi và tôi đã nhận được "
LRI

2
@alex trước hết, vui lòng luôn đề cập đến lỗi chính xác mà bạn gặp phải, nói rằng bạn mắc "LRI" không hữu ích lắm. Trong mọi trường hợp, lỗi có thể là do bạn không có thư mục được đặt tên dir/, đó chỉ là một tên ví dụ, bạn sẽ cần phải thay đổi tên đó thành tên của một thư mục thực: for file in /home/alex/*; do ... doneví dụ.
terdon

cảm ơn, nếu bạn đã làm sai công việc của tôi (... Tôi nghĩ dir là lệnh như ls không phải thư mục-xin lỗi- tôi cũng nghĩ tốt hơn để chỉnh sửa câu trả lời của bạn) Bạn chỉ cần xem "LRI" và không có gì khác.
Mohammad Reza Rezwani

công việc tốt, thnaks, nhưng tôi đã thấy ví dụ bốn dòng "Tệp âm thanh với ID3 phiên bản 2.3.0, chứa" hoặc nhiều hơn một "ISO Media, hệ thống MPEG v4, phiên bản 2". Tôi không chắc chắn về "loại bỏ trùng lặp".
Mohammad Reza Rezwani

@alex đủ công bằng, trả lời chỉnh sửa. Bạn không nên nhận bất kỳ bản sao. Ý sort -uchí sẽ loại bỏ chúng, các dòng phải khác nhau (chúng cũng có thể có một số lượng không gian khác nhau, làm cho chúng không giống nhau).
terdon

3

Tôi có thể sẽ làm một cái gì đó như thế này -

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

Điều đó sẽ tìm kiếm từ đường dẫn hiện tại, cho các tệp (ví dụ: không có thư mục) và sau đó thực thi filelệnh trên mỗi tệp.


1

Thử đi:

ls | xargs file -b | sort | uniq

Làm thế nào nó hoạt động:

ls : liệt kê nội dung thư mục

tệp -b : xác định loại tệp; không thêm tên tập tin vào dòng đầu ra

sắp xếp : sắp xếp các dòng

uniq : bỏ qua các dòng lặp lại



1
Bạn có thể sử dụng file -b *thay vì ls | xargs file -b, để tránh phân tích cú pháp ls.
wjandrea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.