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ó 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:
Mặc dù od -c
thự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
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
for file in dir/*; do ... done;
: lặp qua tất cả mọi thứ trong dir
( dir
chỉ 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 file
trê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ặpdir/
, đó 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 ... done
ví dụ.
sort -u
chí 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).
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 file
lệnh trên mỗi tệp.
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
file -b *
thay vì ls | xargs file -b
, để tránh phân tích cú pháp ls
.