Nếu tôi phát lệnh find như sau:
$ find . -name *.ear
Nó in ra:
./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear
Cái tôi muốn 'in' ra dòng lệnh là tên và kích cỡ:
./dir1/dir2/earFile1.ear 5000 KB
./dir1/dir2/earFile2.ear 5400 KB
./dir1/dir3/earFile1.ear 5400 KB
find . -name '*.ear' -exec ls -lh {} \;
chỉ là h thêm từ trả lời của jer.drab.org. tiết kiệm thời gian chuyển đổi sang MB về mặt tinh thần;)
Bạn cần sử dụng -exec hoặc -printf. Printf hoạt động như thế này:
find . -name *.ear -printf "%p %k KB\n"
-exec mạnh hơn và cho phép bạn thực thi các lệnh tùy ý - vì vậy bạn có thể sử dụng phiên bản 'ls' hoặc 'wc' để in tên tệp cùng với thông tin khác. 'man find' sẽ hiển thị cho bạn các đối số khả dụng cho printf, có thể làm được nhiều việc hơn là chỉ kích thước tệp.
[sửa] -printf không có trong tiêu chuẩn POSIX chính thức, vì vậy hãy kiểm tra xem nó có được hỗ trợ trên phiên bản của bạn không. Tuy nhiên, hầu hết các hệ thống hiện đại sẽ sử dụng GNU find hoặc một phiên bản mở rộng tương tự, vì vậy rất có thể nó sẽ được thực hiện.
một giải pháp đơn giản là sử dụng tùy chọn -ls trong find:
find . -name \*.ear -ls
Điều đó cung cấp cho bạn mỗi mục trong định dạng "ls -l" bình thường. Hoặc, để có được đầu ra cụ thể mà bạn dường như đang tìm kiếm, điều này:
find . -name \*.ear -printf "%p\t%k KB\n"
Nó sẽ cung cấp cho bạn tên tệp theo sau là kích thước tính bằng KB.
Sử dụng gnu find, tôi nghĩ rằng đây là những gì bạn muốn. Nó tìm thấy tất cả các tệp thực chứ không phải thư mục (-type f) và cho mỗi tệp in tên tệp (% p), tab (\ t), kích thước tính bằng kilobyte (% k), hậu tố "KB", và sau đó một dòng mới (\ n).
find . -type f -printf '%p\t%k KB\n'
Nếu lệnh printf không định dạng mọi thứ theo cách bạn muốn, bạn có thể sử dụng exec, theo sau là lệnh bạn muốn thực thi trên mỗi tệp. Sử dụng {} cho tên tệp và chấm dứt lệnh bằng dấu chấm phẩy (;). Trên hầu hết các shell, cả ba nhân vật đó sẽ được thoát bằng dấu gạch chéo ngược.
Đây là một giải pháp đơn giản tìm và in chúng ra bằng cách sử dụng "ls -lh", nó sẽ cho bạn thấy kích thước ở dạng người có thể đọc được (k cho kilobyte, M cho megabyte):
find . -type f -exec ls -lh \{\} \;
Là một lựa chọn khác, "wc -c" sẽ in số lượng ký tự (byte) trong tệp:
find . -type f -exec wc -c \{\} \;
find . -name '*.ear' -exec du -h {} \;
Điều này chỉ cung cấp cho bạn kích thước tệp, thay vì tất cả những thứ không cần thiết.
Tại sao không sử dụng du -a? Ví dụ.
find . -name "*.ear" -exec du -a {} \;
Hoạt động trên máy Mac
Awk có thể sửa chữa đầu ra để đưa ra những gì người hỏi yêu cầu. Trên hệ thống Solaris 10 của tôi, tìm -ls in kích thước tính bằng KB làm trường thứ hai, vì vậy:
% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear
Mặt khác, sử dụng -exec ls -lh và chọn trường kích thước từ đầu ra. Một lần nữa trên Solaris 10:
% find . -name '*.ear' -exec ls -lh {} \; | awk '{print $5, $9}'
5.3M ./dir1/dir2/earFile2.ear
5.3M ./dir1/dir2/earFile3.ear
5.3M ./dir1/dir2/earFile1.ear
Tôi đã vật lộn với điều này trên Mac OS X nơi lệnh find không hỗ trợ -printf
.
Một giải pháp mà tôi tìm thấy, được thừa nhận dựa vào 'nhóm' cho tất cả các tệp là 'nhân viên' là ...
ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'
Điều này chia đầu ra dài ls thành ba mã thông báo
Và sau đó xuất mã thông báo 2 và 3, tức là đầu ra là số byte và sau đó là tên tệp
8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
Điều này sẽ giúp bạn có được những gì bạn đang tìm kiếm, bao gồm định dạng (ví dụ: tên tệp trước và kích thước sau đó):
find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'
đầu ra mẫu (nơi tôi đã sử dụng -iname "*.php"
để nhận được một số kết quả):
./plugins/bat/class.bat.inc.php 20K
./plugins/quotas/class.quotas.inc.php 8.0K
./plugins/dmraid/class.dmraid.inc.php 8.0K
./plugins/updatenotifier/class.updatenotifier.inc.php 4.0K
./index.php 4.0K
./config.php 12K
./includes/mb/class.hwsensors.inc.php 8.0K
[.__.] $ tìm. -name "test *" -exec du -sh {} \; [.__.] 4.0K ./test1[.__. /test4[.__.[$[.__.]
Bạn có thể thử điều này:
find. -name *.ear -exec du {} \;
Điều này sẽ cung cấp cho bạn kích thước tính bằng byte. Nhưng lệnh du cũng chấp nhận các tham số -k cho KB và -m cho MB. Nó sẽ cung cấp cho bạn một đầu ra như
5000 ./dir1/dir2/earFile1.ear
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir3/earFile1.ear
find . -name "*.ear" | xargs ls -sh
Hãy thử các lệnh sau:
GNU stat
:
find . -type f -name *.ear -exec stat -c "%n %s" {} ';'
BSD stat
:
find . -type f -name *.ear -exec stat -f "%N %z" {} ';'
tuy nhiên stat
không phải là tiêu chuẩn, vì vậy du
hoặc wc
có thể là một cách tiếp cận tốt hơn:
find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
find . -name "*.ear" -exec ls -l {} \;