du mà đếm số lượng tập tin / thư mục chứ không phải kích thước


13

Tôi đang cố gắng dọn sạch một ổ cứng có tất cả các loại rác rưởi tích lũy trong nhiều năm. duđã giúp giảm mức sử dụng đĩa, nhưng toàn bộ vẫn không phải là do tổng kích thước, mà là do tổng số lượng tệp và thư mục.

Có cách nào tôi có thể làm một cái gì đó như dunhưng không tính kích thước tệp, mà là số lượng tệp và thư mục? Ví dụ: một tệp là 1 và một thư mục là số đệ quy của các tệp / thư mục bên trong nó + 1.

Chỉnh sửa: Tôi nên đã rõ ràng hơn. Tôi muốn không chỉ biết tổng số tệp / thư mục /, mà còn trong /home, /usrv.v. và trong các thư mục con của chúng, theo cách đệ quy, giống như duđối với kích thước.


2
Hãy nghĩ rằng bạn có thể đang tìm kiếm một cái gì đó giống như một phiên bản sửa đổi một chút của các câu trả lời ở đây superuser.com/questions/198817/ mẹo
James

Câu trả lời:


11

Tôi đã tìm thấy du --inodeshữu ích, nhưng tôi không chắc phiên bản nào của dunó yêu cầu. Trên Ubuntu 17.10, các công việc sau:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Kết hợp với | sort -nrđể sắp xếp giảm dần theo số lượng nút chứa.


1
Điều này trông rất giống những gì tôi muốn hơn là câu trả lời được chấp nhận.
Sridhar Sarnobat 16/03/19

8

Cách dễ nhất dường như là find /path/to/search -ls | wc -l

Tìm được sử dụng để đi bộ mặc dù tất cả các tập tin và thư mục.
-lsđể liệt kê (in) tất cả các tên. Đây là một mặc định và nếu bạn bỏ nó đi thì nó vẫn hoạt động giống như hầu hết các hệ thống. (Hầu như, vì một số có thể có mặc định khác nhau). Đó là một thói quen tốt để sử dụng rõ ràng mặc dù.

Nếu bạn chỉ sử dụng find /path/to/search -lsphần đó, nó sẽ in tất cả các tệp và thư mục lên màn hình của bạn.


wclà số từ. các -ltùy chọn cho nó để đếm số dòng.

Bạn có thể sử dụng nó theo nhiều cách, vd

  • kiểm tra wc
  • mèo thử nghiệm | wc

Tùy chọn đầu tiên cho phép wc mở một tệp và đếm số dòng, từ và ký tự trong tệp đó. Tùy chọn thứ hai thực hiện tương tự nhưng không có tên tệp, nó đọc từ stdin.


Bạn có thể kết hợp các lệnh với một đường ống |. Đầu ra từ lệnh đầu tiên sẽ được dẫn đến đầu vào của lệnh thứ hai. Do đó, find /path/to/search -ls | wc -lsử dụng find để liệt kê tất cả các tập tin và thư mục và cung cấp đầu ra cho wc. Wc sau đó đếm số dòng.

(Một lựa chọn khác sẽ là 'ls | wc', nhưng find linh hoạt hơn nhiều và là một công cụ tốt để học.)


[Chỉnh sửa sau khi bình luận]

Nó có thể hữu ích để kết hợp tìm và thực hiện.

Ví dụ: find / -type d ! \( -path proc -o -path dev -o -path .snap \) -maxdepth 1 -exec echo starting a find to count to files in in {} \;sẽ liệt kê tất cả các thư mục trong /, thanh một số thư mục mà bạn không muốn tìm kiếm. Chúng ta có thể kích hoạt lệnh trước đó trên mỗi tệp, thu được tổng số tệp cho mỗi thư mục trong /.

Tuy nhiên:

  1. Điều này sử dụng phần mở rộng cụ thể của GNU -maxdepth.
    Nó sẽ hoạt động trên Linux, nhưng không phải trên bất kỳ unix-a-alike nào.
  2. Tôi nghi ngờ bạn thực sự có thể muốn một số cho các tệp cho mỗi và mọi thư mục con.

Xin lỗi, không chỉ sâu một cấp mà còn cho tất cả các cấp (đó là ý tôi muốn nói là "đệ quy" trong bản chỉnh sửa của tôi).
Jesse

Thay vì echo echo bạn kích hoạt một tìm kiếm | wc cho mỗi dir. Tôi biết điều đó là có thể, nhưng dường như tôi không thể khám phá ra ngày hôm nay như thế nào. Tôi đoán tôi tiếp tục mắc lỗi tương tự bằng cách nào đó. * Đi pha cà phê *.
Hennes

4

Kịch bản PHP sau đây thực hiện thủ thuật.

#!/usr/bin/php
<?php 

function do_scan($dir, $dev) {
  $total = 1;

  if (\filetype($dir) === 'dir' && \lstat($dir)['dev'] == $dev) {
    foreach (\scandir($dir) as $file) {
      if ($file !== '.' && $file !== '..') {
        $total += do_scan($dir . \DIRECTORY_SEPARATOR . $file, $dev);
      }
    }

    print "$total\t$dir\n";
  }

  return $total;
};

foreach (\array_slice($argv, 1) as $arg) {
  do_scan($arg, \lstat($arg)['dev']);
}

Đặt nó trong một tập tin (giả sử, " treesize"), chmod +xvà chạy nó với ./treesize . | sort -rn | less.


Tại sao đây là câu trả lời được chấp nhận?! Bạn đang giả sử php đang ở trên máy, điều này không phải lúc nào cũng đúng. Các kịch bản không được ghi lại và cụ thể. Mặc dù bạn có thể trả lời câu hỏi của mình trên SE, nhưng câu trả lời này thậm chí không cung cấp Câu trả lời cho câu hỏi của bạn ; hoặc bạn đã không hỏi câu hỏi mà bạn có trong đầu khi vấn đề xảy ra ... Thật không may, tôi không thể đánh giá thấp nó, tôi phải vài điểm ... vẫn là câu trả lời tồi!
user1810087

Tôi không thể viết tập lệnh bằng bất kỳ ngôn ngữ nào mà không giả sử trình thông dịch cho ngôn ngữ đó được cài đặt. Kịch bản in tổng số tệp và thư mục bên dưới mỗi thư mục theo cách đệ quy. Vì vậy, một duchỉ đơn giản là tính thay vì tổng kích thước, đó chính xác
Jesse

2

ncdu là tuyệt vời cho điều này!

Từ trang man, bạn cũng có thể hiển thị số lượng trên mỗi thư mục và thứ tự theo số lượng:

[...]
KEYS
       C   Order by number of items (press again for descending order)
[...]
       c   Toggle display of child item counts.

Ví dụ:

đầu ra ncdu


1

Khai thác thực tế là các thư mục và tập tin được phân tách bằng /. Kịch bản này không đáp ứng tiêu chí của bạn, nhưng phục vụ để truyền cảm hứng cho một giải pháp đầy đủ. Bạn cũng nên xem xét lập chỉ mục các tập tin của bạn với định vị.

geee: /R/tb/tmp
$ find  2>/dev/null | awk -F/ -f filez  | sort -n
files:  57
3       imagemagick
7       portage
10      colemak-1.0
25      minpro.com
42      monolith
80      QuadTree
117     themh
139     skyrim.stings
185     security-howto
292     ~t
329     skyrim
545     HISTORY
705     minpro.com-original
1499    transmission-2.77
23539   ugent-settings

>

$ cat filez
{
a[$2]++;     # $1= folder,  $2 = everything inside folder.
}

END {
        for (i in a) {
                if (a[i]==1) {files++;}
                else { printf "%d\t%s\n", a[i], i; }
        }
        print "files:\t" files
}

>

 $ time locate /  | awk -F/ -f /R/tb/tmp/filez  | sort -n
 files:  13
 2
 2       .fluxbox
 10      M
 11      BIN
 120     bin
 216     sbin
 234     boot
 374     R
 854     dev
 1351    lib
 2018    etc
 9274    media
 30321   opt
 56516   home
 93625   var
 222821  usr
 351367  mnt
 time: Real 0m17.4s  User 0m4.1s  System 0m3.1s

2
Tại sao tôi có .fluxbox trong /? : D
Ярослав Рахматуллин

1

Đây là một giải pháp sử dụng bash, lấy cảm hứng từ một bài đăng từ Unix & Linux .

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

Nếu có một số thư mục mà bạn không muốn xem chi tiết, như .git, bạn có thể loại trừ chúng khỏi danh sách grep.

find . -type d |grep -v "./.git/.*" | while read -r dir; do \
    printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
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.