Liệt kê tất cả các phần mở rộng duy nhất cho các tệp có trong một thư mục


10

Tôi muốn xem tất cả các phần mở rộng duy nhất của các tệp có trong một thư mục nhất định. Lệnh để làm điều đó trong bash là gì?

Người ta có thể sử dụng find . -type fđể lấy tất cả các tệp trong thư mục hiện tại, sau đó tước phần mở rộng và dẫn nó đến uniq. Cách dễ nhất để tước phần mở rộng là gì?

Câu trả lời:


14

Thử cái này:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Nó không có kết quả gì cho:

  • Các tệp không có phần mở rộng
  • Các tệp có tên kết thúc bằng dấu chấm
  • Các tệp ẩn

Nó cũng có thể hữu ích để dẫn nó đến sort | uniq -c.


Không hoạt động với sed mặc định trên máy Mac của tôi. Tôi nhận đượcsed: illegal option -- r
dzhelil

8
@celil: Sử dụng -Ethay vì -rtrên OS X.
Tạm dừng cho đến khi có thông báo mới.

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Hoạt động trên OS X, ngoại trừ các tệp không có phần mở rộng. Thư mục tải xuống của tôi:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Bạn có thể cần sed -rthay thế?


Vấn đề nhỏ: Các tệp không có phần mở rộng in tên của họ. Các tập tin ẩn (chẳng hạn như .DS_Store) in tên của họ mà không dẫn đầu ..


Tôi muốn giới thiệu sort -uthay vì sort | uniq. Ít sử dụng tài nguyên và sử dụng.
John T

Cảm ơn @ John. Đã cố gắng để giữ trong "khuôn khổ" của celil, vì vậy tôi đã không nghĩ về nó.
Daniel Beck

Không cần thiết phải thoát một dấu chấm bên trong [].
Tạm dừng cho đến khi có thông báo mới.

3

Đây là một giải pháp khác không bị nhầm lẫn bởi các tên tệp có chứa các dòng mới được nhúng và sử dụng sort -uzđể sắp xếp chính xác các phần mở rộng tệp có thể đã nhúng các dòng mới:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

Một cách nhanh chóng và dễ nhớ để loại bỏ phần mở rộng là giả sử tất cả tên tệp có định dạng "name.ext", sau đó sử dụng:

 ls -1 | cut -d"." -f2- | sort | uniq -c

điều này cho biết có bao nhiêu phần mở rộng duy nhất, ví dụ:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

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.