it-swarm-vi.tech

Làm cách nào để có được lệnh find để in kích thước tệp với tên tệp?

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
85
Brian
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;)

92
shyam

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.

94
Leigh Caldwell

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.

21
Michael Cramer

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 \{\} \;
19
dmazzoni
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.

7
user2121791

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

4
Andreas

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
4
tpgould

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

  1. những thứ trước văn bản 'nhân viên'
  2. kích thước tập tin
  3. tên tập tin

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
3
Mike M

Đ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
2
adriano72
[.__.] $ tìm. -name "test *" -exec du -sh {} \; [.__.] 4.0K ./test1[.__. /test4[.__.[$[.__.]

Tham khảo Thế giới Scripter

1
scripter

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
1
Yaba
find . -name "*.ear" | xargs ls -sh
1
killdash10

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 < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers