Câu hỏi Có cách nào để buộc du phải báo cáo kích thước thư mục (đệ quy) chỉ bao gồm kích thước tệp không?


Giả sử tôi tạo một thư mục test/, với hai tệp (test/a, test/b) và một thư mục bên trong test/c với một tập tin test/c/d, như thế này:

mkdir test
cd test
touch a
echo 1 > a
touch b
echo 1 > b
mkdir c
cd c
touch d
echo 1 > d
cd ../..
du test -ab

Đầu ra của dòng cuối cùng (chạy du) Là:

2       test/a
4096    test/c
2       test/b
8196    test

Kích thước của thư mục là 8196 (thay vì 6, đó là: kích thước của tệp + kích thước của tệp b + kích thước của tệp c / d). Điều này là bởi vì, như tôi hiểu nó, du bao gồm kích thước của các thư mục mình (bởi vì một thư mục chỉ là một tập tin đặc biệt, trong đó ghi lại các mục tập tin trong đó).

Tôi không muốn điều đó. Tôi muốn thấy kích thước kết hợp của tất cả các tệp tin trong một thư mục (cách Windows Explorer báo cáo kích thước thư mục). Vì vậy, trong ví dụ này, kết quả sẽ là:

2       test/a
2       test/c
2       test/b
6       test

Quan trọng hơn, những gì tôi thực sự muốn là dòng cuối cùng: tổng kích cỡ của tất cả các tệp trong thư mục (đệ quy).

Nhưng tôi đã trải qua tất cả các lựa chọn của du, và dường như không có cách nào để làm điều này. Không có cách nào khác ư?


2
2017-12-20 15:47


gốc


Chỉ cần ra khỏi tò mò là có một lý do cho điều này? Thông thường bạn muốn biết cần bao nhiêu không gian để lưu trữ các tệp đó trong cấu trúc đó, và điều đó sẽ bao gồm kích thước của một thư mục. - Darth Android
Lý do có thể là một chút ngu ngốc :) Tôi chỉ cần sao chép một thư mục lớn từ máy linux của tôi vào máy tính của tôi, và bây giờ tôi chỉ muốn một cách đơn giản để đảm bảo rằng mọi thứ đã được sao chép OK. Vì vậy, tôi nghĩ, bệnh chỉ cần kiểm tra tổng kích cỡ của cả hai thư mục trên cả hai máy. Nhưng tổng số khác nhau, vì vậy tôi nhìn vào nó, và thấy rằng du bao gồm kích thước của thư mục chính nó và cửa sổ thám hiểm không, vì vậy tôi nghĩ có thể có một cách để thi đua hành vi giống như thám hiểm cho du, bởi vì explorer không có toàn bộ tính linh hoạt :) - Kipras
Trong khi không trả lời câu hỏi, điều này câu hỏi cung cấp một phương tiện để xác minh tính toàn vẹn của các tập tin được sao chép giữa Linux và Windows, và làm thế nào tôi sẽ khuyên bạn nên làm kiểm tra xác minh tập tin. - Darth Android


Các câu trả lời:


$ ls -goR | awk '{sum += $3} END{print sum}'
16992

Chỉnh sửa. Để loại trừ thư mục, hãy sử dụng grep

$ ls -goR | grep -v ^d | awk '{sum += $3} END{print sum}'
6

0
2017-12-20 15:55



Đó không phải là chính xác những gì tôi cần (tôi đã cập nhật câu hỏi cụ thể hơn). Nếu tôi hiểu chính xác, điều này sẽ tạo ra tổng kích cỡ của các tệp trong thư mục hiện tại (đệ quy), điều này tốt và không bao gồm kích thước của thư mục hiện tại (tốt lần nữa), nhưng nó bao gồm các kích thước của các thư mục bên trong (không tốt). Tôi đã thêm một thư mục bên trong c và một tệp c / d trong câu hỏi, cụ thể hơn. - Kipras
@Kipras: Xem câu trả lời được cập nhật. - RedGrittyBrick
Hoạt động, nhưng thư mục là quá lớn, rằng nếu tôi chạy lệnh này ở gốc của nó, awk trả về inf. Bạn có biết cách nào để giải quyết nó không? Những gì tôi đã kết thúc làm là chạy riêng này cho mỗi thư mục con. - Kipras
@ Kipras: Bạn phải thực hiện một số lựa chọn. Bạn có thể thay đổi ls để báo cáo kích thước theo khối. Bạn có thể thay đổi kịch bản awk để chia $ 3 cho 1024. Bạn có thể thay thế awk bởi Perl. Trong extremis bạn có thể sử dụng mô-đun toán học :: BigInt của Perl. Bạn có thể suy nghĩ lại những gì bạn đang làm và tính toán tổng kiểm tra thay thế. Bạn có thể sử dụng một cổng ls trên Windows, chuyển hướng đầu ra vào một tập tin và làm một sự khác biệt. Vân vân - RedGrittyBrick


Nếu tất cả những gì bạn muốn là kích thước của các tập tin, không bao gồm không gian các thư mục mất, bạn có thể làm một cái gì đó như

$ find test/ -type f -print0 | xargs -0 du -scb | awk '/total/{k+=$1}END{print k" total"}'
6   total

1
2018-06-02 16:58



Nhưng điều này sẽ thất bại nếu có quá nhiều tệp xargs cần gọi du nhiều lần, phải không? - Scott
@ Scott có nó sẽ, điểm tốt. Tôi đã sửa nó bằng cách sử dụng awk  thay vào đó, cảm ơn. - terdon


Bạn chỉ rõ rằng bạn muốn tóm tắt các tệp trong một thư mục, nhưng đầu ra ví dụ của bạn bao gồm các tệp cụ thể.

Để biết chi tiết bao gồm các tệp cụ thể, hãy thử cách này:

$ find test/ -exec du -s {} \;

20      test/
4       test/b
4       test/a
8       test/c
4       test/c/d

Đối với chỉ một bản tóm tắt của mỗi thư mục, hãy thử điều này:

$ find test/ -type d -exec du -s {} \;

20      test/
8       test/c

Hy vọng rằng sẽ giúp bạn?


0
2017-12-20 16:30



... và downvote là cho chính xác những gì? - Bryan