it-swarm-vi.com

Làm cách nào để tôi đếm tất cả các tệp đệ quy thông qua các thư mục

Tôi muốn xem có bao nhiêu tệp trong thư mục con để tìm ra nơi sử dụng tất cả các nút trên hệ thống. Kiểu như tôi sẽ làm điều này để sử dụng không gian

du -sh /*

nó sẽ cho tôi không gian được sử dụng trong các thư mục gốc, nhưng trong trường hợp này tôi muốn số lượng tệp chứ không phải kích thước.

52
xenoterracide
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Cảm ơn Gilles và xenoterracide để sửa lỗi an toàn/tương thích.

Phần đầu tiên: find -maxdepth 1 -type d sẽ trả về một danh sách tất cả các thư mục trong thư mục làm việc hiện tại. Điều này được dẫn đến ...

Phần thứ hai: while read -r dir; do bắt đầu một vòng lặp while - miễn là đường ống đi vào while được mở (cho đến khi toàn bộ danh sách các thư mục được gửi), lệnh read sẽ đặt dòng tiếp theo vào biến "dir". Rồi nó tiếp tục ...

Phần thứ ba: printf "%s:\t" "$dir"; sẽ in chuỗi trong "$ dir" (đang giữ một trong các tên thư mục) theo sau là một tab.

Phần thứ tư: find "$dir -f file" tạo một danh sách tất cả các tệp bên trong tên thư mục được giữ trong "$ dir". Danh sách này được gửi đến ..

Phần thứ năm: wc -l; đếm số lượng dòng được gửi vào đầu vào tiêu chuẩn của nó.

Phần cuối cùng: done chỉ đơn giản là kết thúc vòng lặp while.

Vì vậy, chúng tôi nhận được một danh sách tất cả các thư mục trong thư mục hiện tại. Đối với mỗi thư mục đó, chúng tôi tạo một danh sách tất cả các tệp trong đó để chúng tôi có thể đếm tất cả chúng bằng cách sử dụng wc -l. Kết quả sẽ như sau:

./dir1: 234
./dir2: 11
./dir3: 2199
...
67
Shawn J. Goff

Thử find . -type f | wc -l, nó sẽ đếm tất cả các tệp trong thư mục hiện tại cũng như tất cả các tệp trong thư mục con. Lưu ý rằng tất cả các thư mục sẽ không được tính là tệp, chỉ các tệp thông thường mới làm.

17
herohuyongtao

Đây là phần tổng hợp một số lệnh liệt kê hữu ích (được băm lại dựa trên mã người dùng trước đó):

Liệt kê các thư mục có số tập tin :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done

Liệt kê các thư mục có số tập tin khác không :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Liệt kê các thư mục có số lượng thư mục con :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

Liệt kê các thư mục có số thư mục con khác không:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Liệt kê các thư mục trống :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done

Liệt kê các thư mục không trống có số lượng nội dung :

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
13
DolphinDream

Thử:

find /path/to/start/at -type f -print | wc -l

làm điểm bắt đầu hoặc nếu bạn thực sự chỉ muốn truy xuất lại thông qua các thư mục con của thư mục (và bỏ qua các tệp trong thư mục cấp cao nhất đó)

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
12
Cry Havok

Giải pháp sau đây đếm số lượng thực tế của các nút được sử dụng bắt đầu từ thư mục hiện tại:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

Để lấy số lượng tệp của cùng một tập hợp con, hãy sử dụng:

find . | wc -l

Đối với các giải pháp chỉ khám phá các thư mục con, mà không đưa vào các tệp tài khoản trong thư mục hiện tại, bạn có thể tham khảo các câu trả lời khác.

4
mouviciel

OS X 10.6 cuộn cảm với lệnh trong câu trả lời được chấp nhận, vì nó không chỉ định đường dẫn cho find. Thay vào đó sử dụng:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
2
abeboparebop

Tôi biết tôi đến bữa tiệc muộn, nhưng tôi tin rằng giải pháp bash (hoặc Shell khác chấp nhận sao đôi toàn cầu) này có thể nhanh hơn nhiều trong một số trường hợp:

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

đầu ra:

d1/:    302
d2/:    24
d3/:    640
...
2
jimmij

Hãy thử xem:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

Nó sẽ hoạt động tốt trừ khi tên tập tin bao gồm các dòng mới.

du --inodes

Tôi không chắc tại sao không ai (bao gồm cả tôi) biết:

du --inodes
--inodes
      list inode usage information instead of block usage

Tôi khá chắc chắn rằng điều này giải quyết vấn đề của OP. Tôi đã bắt đầu sử dụng nó rất nhiều để tìm ra nơi chứa tất cả rác trong các ổ đĩa lớn của mình (và giảm tải nó vào một đĩa cũ hơn).

Thêm thông tin

Nếu bạn không muốn lặp lại (có thể hữu ích trong các tình huống khác), hãy thêm

-S, --separate-dirs
1
Sridhar Sarnobat

Nếu bạn đã cài đặt ncdu (phải có khi bạn muốn dọn dẹp), chỉ cần nhập c thành "Chuyển đổi hiển thị số lượng mục con". Và C thành "Sắp xếp theo các mục".

1
Demi-Lune