Shell script để tìm tất cả các loại tệp trong một thư mục có số lượng của chúng


7

Tôi muốn viết một shell scripthoặc aliasđể tìm số lượng các loại tệp khác nhau trong một thư mục. Ví dụ: đầu ra mẫu của tập lệnh phải là:

*.h      20
*.c      40
*.cpp    10
Makefile 3

Câu trả lời:


8
find . -type f -name '*.*' -exec sh -c 'echo ${0##*.}' {} \; | sort | uniq -c | sort -nr

Việc echo ${0##*.}cung cấp cho bạn phần mở rộng của tập tin. Chúng tôi dẫn đầu ra sortvà sau đó đếm các dòng duy nhất với uniq.

Một số bổ sung:

  • Vì đầu ra của uniqkhông được sắp xếp theo số lần xuất hiện, bạn sẽ phải chuyển một lần nữa thành một loại số ( -nr) nếu bạn muốn nó được sắp xếp.
  • Nếu bạn chỉ muốn tìm kiếm thư mục hiện tại của bạn, hãy thêm -maxdepth 1vào findlệnh của bạn .
  • Ống vào awk '{print $2, $1}'để hiển thị số lượng sau khi mở rộng.

Câu trả lời tốt đẹp. Điều này sẽ không bao gồm các tập tin mà không có phần mở rộng. Có một cách đơn giản để tìm thấy điều đó?
jaychris

Các -name '*.*'tùy chọn hạn chế findcác tập tin với phần mở rộng chỉ. Nếu bạn bỏ qua phần này, bạn sẽ kết thúc với số lượng 1 cho mỗi tệp, vì vậy điều này có thể không lý tưởng.
slhck

Bạn có thể thêm một nhánh trong sh để kiểm tra xem nó có phần mở rộng không, nếu vậy thì in phần mở rộng, nếu không in tên tệp đầy đủ; và tìm *
Clayton Stanley

@ClaytonStanley Vì shquá trình bổ sung mất thêm một chút thời gian thực hiện, nên việc lọc kết quả findsẽ nhanh hơn một chút, tôi đoán vậy.
slhck
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.