Nhận tất cả các phần mở rộng và số tập tin tương ứng của chúng trong một thư mục


14

Bắt tất cả các phần mở rộng cho một thư mục: dễ dàng. Lấy số lượng tập tin cho một phần mở rộng cụ thể: dễ dàng.

Nhưng nhận được tất cả các phần mở rộng tập tin và số lượng tập tin tương ứng của họ đang ám chỉ tôi.

ví dụ.

+ dir
 + abc.txt
 + def.txt
 + abc.pdf
 * def.pov

nên trả lại một cái gì đó như:

.txt 2
.pdf 1
.pov 1

Mục đích của bài tập này là tôi muốn tìm ra phần mở rộng tập tin nào phổ biến trong một thư mục nhất định.

Cảm ơn trước

Câu trả lời:


47
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
      1 .6
      1 .cache
      1 .noconf
      1 .php
      1 .sl
      2 .bin
      2 .el
      2 .tdb
      4 .baseA
      4 .baseB
      4 .dat
      4 .DB
     27 .db
    221 .deb

Đây là lời giải thích:

find ./ -type f

chỉ tìm tập tin, không phải thư mục

grep -E ".*\.[a-zA-Z0-9]*$"

tập tin lọc với phần mở rộng

sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'

xóa đường dẫn và tên tệp, chỉ lưu phần mở rộng

sort | uniq -c | sort -n

sắp xếp, uniq và sắp xếp


Bạn có thể làm cho regex của mình cho phép nhiều ký tự trong tiện ích mở rộng và loại bỏ grepbằng cách thực hiện việc này:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
Tạm dừng cho đến khi có thông báo mới.

Dennis, thay thế grep và sed bằng sed của bạn trả về lỗi sau: sed: -e biểu thức # 1, char 30: tham chiếu không hợp lệ \ 1 trên RHS của lệnh 's'
khử nhiễu

1

Vì bạn đang sử dụng Linux (gnu grep), đây là thời điểm tốt để sử dụng tùy chọn Perl REs (PCRE) -Pvà grep -o. Lấy câu trả lời của @ bindbn như một ứng cử viên tuyệt vời:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
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.