Nhận tổng kích thước tệp từ một tệp chứa danh sách tệp


14

Tôi có một tệp chứa danh sách các tệp mà tôi muốn biết tổng kích thước tệp. Có một lệnh để làm như vậy?

HĐH của tôi là một linux rất cơ bản (Qnap TS-410).

BIÊN TẬP:

Một vài dòng từ tệp:

/ share / archive / Bailey Test / BD006 / 0.tga
/ share / archive / Bailey / BD007 / 1 phiên bản 1.tga
/ share / archive / Bailey 2 / BD007 / example.tga


Hãy cho chúng tôi một vài dòng ví dụ của tập tin.
EEAA

Ví dụ từ tập tin được thêm vào.
Nicolas

Đó là một loại NAS, phải không? Bạn đã cài đặt busybox chưa?
cjc

Có nó và tôi nghĩ rằng nó đã được cài đặt, tại sao?
Nicolas

Câu trả lời:


13

Tôi tin rằng một cái gì đó như thế này sẽ hoạt động trong busybox:

du `cat filelist.txt` | awk '{i+=$1} END {print i}'

Tôi không có cùng môi trường với bạn, nhưng nếu bạn gặp phải vấn đề với khoảng trắng trong tên tệp thì một cái gì đó như thế này cũng sẽ hoạt động:

cat filelist.txt | while read file;do
  du "$file"
done | awk '{i+=$1} END {print i}'

Chỉnh sửa 1 :
@stew ở ngay trong bài đăng của mình bên dưới, du hiển thị mức sử dụng đĩa và không phải là kích thước tệp chính xác. Để thay đổi hành vi busybox sử dụng cờ -a, vì vậy hãy thử: du -a "$file"để biết chính xác kích thước tệp và so sánh đầu ra / hành vi.


1
Cảm ơn bạn đã nhập, lệnh đầu tiên trả về /usr/bin/du: Argument list too long(gần 80.000 dòng trong tệp của tôi). Lệnh thứ hai của bạn chỉ cho tôi một dấu nhắc khi tôi nhấn enter, chờ đợi điều gì nữa?
Nicolas

Khó nói với môi trường của bạn. Đây có phải là dấu nhắc lệnh bình thường hay chỉ là dấu nhắc nhấp nháy? Nếu sau này nó có thể chậm chờ kết quả, nếu đó là "dấu nhắc nhập" thì có thể là bạn đã bỏ lỡ một số ký tự? Và nếu đó là một dấu nhắc bình thường mà tôi không biết, tôi đã kiểm tra nó khá kỹ trước khi tôi gõ nó. :(
Mattias Ahnberg

đó là một "dấu nhắc đầu vào" khi tôi làm như sau cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. cảm ơn mattias
Nicolas

1
Ah! Nếu bạn đặt mọi thứ trên một dòng bạn cần một dòng khác; như thế này: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(tức là trước khi thực hiện).
Mattias Ahnberg

Tại chỗ trên! Nó hoạt động hoàn hảo, chúc mừng! (mặc dù tôi có thể tự mình tìm ra sai lầm này)
Nicolas

8
du -c `cat filelist.txt` | tail -1 | cut -f 1

-cthêm dòng "tổng kích thước";
tail -1mất dòng cuối cùng (với tổng kích thước);
cut -f 1cắt từ "tổng".


Điều này thất bại với danh sách du - argument quá dài. Filelist của tôi là lớn. Câu trả lời dưới đây với xargs dường như là giải pháp dễ nhất.
Syclone0044

4

Tôi không biết các công cụ linux của bạn có khả năng này không, nhưng:

cat /tmp/filelist.txt  |xargs -d \\n du -c

Do, các xargs sẽ đặt dấu phân cách thành một ký tự dòng mới và du sẽ tạo ra một tổng số lớn cho bạn.

Nhìn vào http://busybox.net/doads/BusyBox.html có vẻ như "busybox du" sẽ hỗ trợ tùy chọn tổng thể, nhưng "busybox xargs" sẽ không hỗ trợ các dấu phân cách tùy chỉnh.

Một lần nữa, tôi không chắc chắn về bộ công cụ của bạn.


đây là kết quả:xargs: invalid option -- d
Nicolas

Tuyệt vời: làm việc với linux busybox của NAS giống như một tập McGuyver, cố gắng chế tạo một chiếc máy bay hoạt động từ một số vải, gậy và dây bện.
cjc

Còn về điều này, nếu bạn có chỗ cho nó trên một máy khác: sao chép tất cả các tệp mà bạn quan tâm sang một số linux khác, đầy đủ chức năng, rồi chạy giải pháp Stew's ở đó. Làm điều đó có thể dễ dàng hơn nhiều so với việc cố gắng tìm hiểu xem busybox có khả năng làm điều này không.
cjc

1
Tôi nghĩ rằng câu trả lời là tốt nhất. Nó ngắn gọn và nhanh hơn nhiều so với các câu trả lời khác trong chủ đề này.
zymhan

Câu trả lời tốt. Bạn có thể muốn rời khỏi -cvì xargs sẽ thực hiện nhiều cuộc gọi đến dunếu filelist đủ dài, tạo ra một dusố tổng.
qwr

4
while read filename ;  do stat -c '%s' $filename ; done < filelist.txt | awk '{total+=$1} END {print total}'

Điều này tương tự với giải pháp của Mattias Ahnberg. Sử dụng "đọc" sẽ giải quyết được các vấn đề với tên tệp / thư mục có khoảng trắng. Tôi sử dụng statthay vì duđể có được các kích thước tập tin. du đang nhận được số lượng phòng mà nó đang sử dụng trên đĩa thay vì kích thước tệp, có thể khác nhau. Tùy thuộc vào hệ thống tệp của bạn, tệp 1 byte sẽ vẫn chiếm 4k trên đĩa (hoặc bất kể kích thước khối là gì). Vì vậy, đối với tệp 1 byte, stat nói 1 byte và du nói 4k.


Nhận xét tốt về tập tin kích thước vs đĩa!
Mattias Ahnberg

Thật sự rất thú vị bình luận, thật không may, linux của tôi không biết statlệnh:stat: command not found
Nicolas

Bạn có thể phải nói "bận rộn stat".
cjc

nó nói stat: applet not foundtrong trường hợp này
Nicolas

4

Đây là một giải pháp khác cho vấn đề:

cat filelist.txt | tr '\n' '\0' | wc -c --files0-from=-

Đối với tôi (trên cygwin) du -bcchạy nhanh hơn rất nhiều.
qwr

2

Hãy thử một cái gì đó như thế này:

$ cat filelist.txt | xargs ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

Để xử lý đúng các khoảng trắng trong đường dẫn:

$ find /path/to/files -type f -print0 | xargs -0 ls -l | awk '{x+=$5} END {print "total bytes: " x}' 

cảm ơn về đầu vào của bạn, thật không may, tôi nghĩ rằng có vấn đề với các khoảng trắng trong các thư mục trong tệp của tôi không được thoát với "\"., do đó nó bị hỏng trong khi đi qua danh sách tệp.
Nicolas

Bạn có thể bỏ qua danh sách tập tin văn bản và chỉ tạo ra điều này từ thông số findkhông?
EEAA

Thật không may, danh sách quá dài, có 79159 dòng tệp (đường dẫn đầy đủ), đó là lý do tại sao tôi xuất nó thành một tệp; có lẽ tôi có thể thêm một đối số về việc thoát khỏi kết quả tìm thấy?
Nicolas

không có đối số "-print0" với tìm kiếm trên hệ thống linux của tôi
Nicolas

@Nicolas - đó là do nó sử dụng chương trình rút gọn của busybox findthay vì findnhị phân thực .
EEAA

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.