Tìm phần mở rộng khớp tệp, sau đó đếm tệp trong thư mục tìm thấy


1

Tôi đang cố gắng tìm kiếm hệ thống tập tin cho tất cả các tệp khớp với một phần mở rộng ( *.what), sau đó đếm tất cả các tệp trong thư mục nơi tìm thấy các *.whattệp. Đầu ra phải chứa tên thư mục và tên tệp có số lượng.

Điều này có thể giải quyết như thế nào?


1
cd / thư mục find -name * .extension này sẽ liệt kê tất cả các tệp có phần mở rộng
Ajo Mathew

Câu trả lời:


4

Đầu tiên bạn sẽ sử dụng findlệnh trong terminal.

find . -type f -name "*.what"

Điều đó sẽ liệt kê tất cả các tệp trên hệ thống từ thư mục hiện tại "." khớp "type: file" và tên "* .what".

Vì vậy, bạn có thể kết hợp nó vào một tập lệnh bash, như vậy:

Biên tập

Ở đây bạn đi, đây là những gì bạn muốn tôi nghĩ.

#!/bin/bash

src=${1:-"."}
ext=${2:-"what"}

for dir in `find ${src} -type f -name "*.${ext}"`; do
    dir=`echo ${dir} | awk 'BEGIN{FS=OFS="/"}{$NF=""}{print}'`
    echo ${dir} "has" `ls -l ${dir} | awk '!NR=1 && !/^d/ && !/*.what/ {print $NF}' | wc -l` "file(s)"
done

Điều đó sẽ xuất ra số lượng tệp trong bất kỳ thư mục nào chứa * .what (đệ quy). Số nếu tệp không bao gồm thư mục !/^d/và tệp * .what !/*.what/.

Điều đó sẽ đưa bạn đến đó. Hoạt động trên hệ thống của tôi ít nhất, giả sử tôi hiểu câu hỏi.


hmm, một cái gì đó không hoạt động hoàn toàn đúng, tập lệnh chỉ xuất ra 1 tập tin được tìm thấy sau đó kết thúc. Nó không tìm kiếm thông qua tất cả các thư mục và thư mục con. Chỉ cần nhắc lại, tôi muốn tìm bất kỳ tệp nào kết thúc bằng * .what và sau đó đếm số lượng của tất cả các tệp trong cùng thư mục đó, không chỉ đếm các tệp * .what trong pwd.
Cyw

Đó là vì tôi đã hiểu nhầm, hiện tại nó chỉ đang đếm số lượng * .what. Tôi sẽ cập nhật trong một vài.
nerdwaller

@Cyw đã cập nhật ở trên ^^
nerdwaller

Cảm ơn rất nhiều! Nhìn tốt hơn, tôi vẫn không nhận được kết quả và đang gặp lỗi "awk: xregcomp: Biểu thức chính quy không hợp lệ trước" có thể là do hệ thống VMware ESXi 5.x của nó chạy AWK từ BusyBox v1.9.1-VMware-visor-8630 ( 2012-01-06 01:09:05 PST) nhị phân đa cuộc gọi ??
Cyw

Vâng, awk có thể cư xử khác nhau trong busybox. Hãy thử phá vỡ nó để xem nó là gì, hoặc cả hai sử dụng.
nerdwaller

1

Hãy thử đường ống này:

find -name '*.what' -exec dirname {} \; | sort | uniq -c

Tôi cần điều này để đếm các tệp trong bất kỳ thư mục nào có tìm thấy tệp * .what và nếu số lượng nhỏ hơn một số #, hãy hiển thị pwd và tên tệp và tổng số tệp trong thư mục đó. Điều này cần phải là một tìm kiếm đệ quy. Cảm ơn bạn
Cyw

0
$ mèo tmp / example.awk
{
   một [$ 1] ++
} KẾT THÚC {
   cho (tôi trong một) {
     dir = i; gsub ("", "\\", thư mục);
     printf "echo% s:% d; cd% s; ls -1 * htm; cd -> / dev / null; echo \ n", \
        i, một [i], dir, dir
   }
}

Đầu ra mẫu:

find . -iname "*.htm" -printf "%h\t%f\n" |sort |\
    awk -F'\t' -f tmp/example.awk |sh
(...)
./fpsu/applikasjon/kjerne/lib: 1
xom-1.0b5.htm

./tmp/refcp/refcp/home/jaroslav/reference/programing/input- Processing: 1
Viết hoa + cá nhân + tên.htm

./Tải xuống tập tin / index: 3
allgroupes-frame.htm
tổng quan-frame.htm
tổng quan-tóm tắt.

./tmp/refcp/refcp/home/jaroslav/reference/code/html-css/common-web-fonts_files: 6
hostbadge_002.htm
hostbadge_003.htm
hostbadge.htm
thích_002.htm
thích_003.htm
thích.htm
(...)

Bước đầu tiên là in mọi thư mục và tên tệp với một phần mở rộng nhất định. Điều đó được thực hiện với các đối số% h% t để tìm printf.

Bước tiếp theo là đếm mọi mục trong một thư mục đã cho bằng [$ 1] ++ trong chương trình awk. Đó là, đối với mỗi dòng được in, chúng tôi tăng một mục nhập mảng với chỉ mục bằng với tên của thư mục được tìm thấy có chứa các tệp có hậu tố đã cho.

Khi tất cả các mục đã được tính, chúng tôi lặp lại một lệnh shell đơn giản để in kết quả và liệt kê các tệp trong mỗi thư mục mà chúng tôi tìm thấy.

Kết quả là một danh sách các lệnh shell mà chúng ta đưa vào sh.


-1
find -name *.c|grep -c .c

điều này sẽ tìm thấy số lượng các mục có phần mở rộng .c

find -name *.c 

sẽ liệt kê cấu trúc thư mục của các mục có phần mở rộng .c

!/bin/bash

find -name *$1|grep -c $1
find -name *$1

lưu cái này dưới dạng list.sh in / home / yourname / bin

Chmod +x list.sh
chown {username} list.sh

gọi nó ở bất cứ đâu theo danh sách * .extension

Thí dụ list *.c


Tôi thích cái này. Nhưng bạn cần đưa ra đề nghị của @ cYrus.
nerdwaller

1
Bạn nên trích dẫn *.c.
cYrus

bằng cách sử dụng Ubuntu, nó hoạt động với trích dẫn .. Kịch bản đơn giản #!/bin/bash find -name *$1|grep -c $1 find -name *$1
Ajo Mathew

Cập nhật câu trả lời đơn giản
Ajo Mathew

Đây là một khởi đầu tốt nhưng tôi cần một cách để đếm tất cả các tệp trong bất kỳ thư mục nào có tệp * .what được tìm thấy và hiển thị tên tệp & tên thư mục và tổng số tệp trong thư mục đó tìm thấy tệp * .what
Cyw
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.