it-swarm-id.com

Bagaimana cara mendapatkan perintah find untuk mencetak ukuran file dengan nama file?

Jika saya mengeluarkan perintah find sebagai berikut:

$ find . -name *.ear

Mencetak:

./dir1/dir2/earFile1.ear
./dir1/dir2/earFile2.ear
./dir1/dir3/earFile1.ear

Yang ingin saya 'cetak' ke baris perintah adalah nama dan ukurannya:

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

hanya tambahan h dari balasan jer.drab.org. menghemat waktu konversi ke MB mental;)

92
shyam

Anda perlu menggunakan -exec atau -printf. Printf berfungsi seperti ini:

find . -name *.ear -printf "%p %k KB\n"

-exec lebih kuat dan memungkinkan Anda menjalankan perintah sewenang-wenang - sehingga Anda dapat menggunakan versi 'ls' atau 'wc' untuk mencetak nama file bersama dengan informasi lainnya. 'man find' akan menunjukkan kepada Anda argumen yang tersedia untuk printf, yang dapat melakukan lebih dari sekedar filesize.

[edit] -printf tidak dalam standar POSIX resmi, jadi periksa apakah itu didukung pada versi Anda. Namun, sebagian besar sistem modern akan menggunakan GNU find atau versi yang sama-sama diperluas, sehingga ada peluang bagus untuk mengimplementasikannya.

94
Leigh Caldwell

solusi sederhana adalah dengan menggunakan opsi -l di find:

find . -name \*.ear -ls

Itu memberi Anda setiap entri dalam format "ls-l" normal. Atau, untuk mendapatkan hasil spesifik yang tampaknya Anda cari, ini:

find . -name \*.ear -printf "%p\t%k KB\n"

Yang akan memberi Anda nama file diikuti dengan ukuran dalam KB.

21
Michael Cramer

Menggunakan gnu find, saya pikir ini yang Anda inginkan. Ia menemukan semua file nyata dan bukan direktori (-type f), dan untuk masing-masing mencetak nama file (% p), tab (\ t), ukuran dalam kilobyte (% k), akhiran "KB", dan kemudian baris baru (\ n).

find . -type f -printf '%p\t%k KB\n'

Jika perintah printf tidak memformat hal-hal seperti yang Anda inginkan, Anda dapat menggunakan exec, diikuti dengan perintah yang ingin Anda jalankan pada setiap file. Gunakan {} untuk nama file, dan akhiri perintah dengan tanda titik koma (;). Pada sebagian besar shell, ketiga karakter tersebut harus lolos dengan garis miring terbalik.

Berikut adalah solusi sederhana yang menemukan dan mencetaknya menggunakan "ls -lh", yang akan menunjukkan ukurannya dalam bentuk yang dapat dibaca manusia (k untuk kilobyte, M untuk megabita):

find . -type f -exec ls -lh \{\} \;

Sebagai alternatif lain, "wc -c" akan mencetak jumlah karakter (byte) dalam file:

find . -type f -exec wc -c \{\} \;
19
dmazzoni
find . -name '*.ear' -exec du -h {} \;

Ini memberi Anda ukuran file saja, bukan semua hal yang tidak perlu.

7
user2121791

Mengapa tidak menggunakan du -a? Misalnya.

find . -name "*.ear" -exec du -a {} \;

Bekerja pada Mac

4
Andreas

Awk dapat memperbaiki output untuk memberikan apa yang diminta penanya. Pada sistem Solaris 10 saya, temukan -l mencetak ukuran dalam KB sebagai bidang kedua, jadi:

% find . -name '*.ear' -ls | awk '{print $2, $11}'
5400 ./dir1/dir2/earFile2.ear
5400 ./dir1/dir2/earFile3.ear
5400 ./dir1/dir2/earFile1.ear

Jika tidak, gunakan -exec ls -lh dan pilih bidang ukuran dari output. Lagi di 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

Saya kesulitan dengan ini di Mac OS X di mana perintah find tidak mendukung -printf.

Solusi yang saya temukan, yang diakui bergantung pada 'grup' untuk semua file menjadi 'staf' adalah ...

ls -l -R | sed 's/\(.*\)staff *\([0-9]*\)..............\(.*\)/\2 \3/'

Ini membagi output lama menjadi tiga token

  1. hal-hal sebelum teks 'staf'
  2. ukuran file
  3. nama file

Dan kemudian keluaran token 2 dan 3, yaitu output adalah jumlah byte dan kemudian nama file

8071 sections.php
54681 services.php
37961 style.css
13260 thumb.php
70951 workshops.php
3
Mike M

Ini akan memberi Anda apa yang Anda cari, dengan menyertakan pemformatan (mis. Nama file terlebih dahulu dan ukuran sesudahnya):

find . -type f -iname "*.ear" -exec du -ah {} \; | awk '{print $2"\t", $1}'

contoh output (tempat saya menggunakan -iname "*.php" untuk mendapatkan hasil):

./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
 $ find. -nama "test *" -exec du -sh {} \; 
 4.0 K. /test4[.____.

Referensi Dunia Tulisan

1
scripter

Anda bisa mencoba ini:

find. -name *.ear -exec du {} \;

Ini akan memberi Anda ukuran dalam byte. Tetapi perintah du juga menerima parameter -k untuk KB dan -m untuk MB. Ini akan memberi Anda output seperti

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

Coba perintah berikut:

GNU stat:

find . -type f -name *.ear -exec stat -c "%n %s" {} ';'

BSD stat:

find . -type f -name *.ear -exec stat -f "%N %z" {} ';'

namun stat tidak standar, jadi du atau wc bisa menjadi pendekatan yang lebih baik:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'
1
kenorb
find . -name "*.ear" -exec ls -l {} \;
0
Jeremy Weathers