Dosya boyutunu dosya adıyla yazdırmak için find komutunu nasıl edinebilirim?


108

Find komutunu aşağıdaki gibi verirsem:

$ find . -name *.ear

Yazdırılır:

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

Komut satırına 'yazdırmak' istediğim şey ad ve boyut:

./dir1/dir2/earFile1.ear  5000 KB
./dir1/dir2/earFile2.ear  5400 KB
./dir1/dir3/earFile1.ear  5400 KB

Yanıtlar:


111
find . -name '*.ear' -exec ls -lh {} \;

jer.drab.org'un cevabından sadece h ekstra. zihinsel olarak MB'ye dönüştürmede zaman kazandırır;)


8
Bu sürüm, her dosya için "ls" işlemini gerçekleştirecektir. Çok sayıda dosyanız varsa (örneğin, binden fazla), bunu: find . -name '*.ear' -exec ls -lh {} + \;(GNU uzantısı) veya find . -name '*.ear' -print0 | xargs -0 ls -lh. Ayrıca -type f, yalnızca dosyalarla ilgileniyorsanız eklemek -disteyebilirsiniz (veya dizinlerin içerikleri olmadan kendilerinin de dahil edilmesini istiyorsanız ls'ye ekleyin ).
ash108

2
Cevabınız dizinleri dışlamaz, dolayısıyla dizinlerde de ls çalıştırmaya başlayacaksınız, ki bu açıkça yapılacak doğru şey değildir.
Faheem Mitha

2
Bu, işleri yapmanın gerçekten verimsiz bir yoludur ve ne yazık ki ash108'in yorumları da ideal değildir. Bulmak için -printf seçeneğini kullanmak çok daha iyidir.
oskarpearson

dmazzoni'nin yanıtı çok daha etkilidir çünkü her dosyada fork + exec'yi önler (makinemde 100 kat daha hızlı). % K'yi% s olarak değiştirmek zorunda kaldım. @FaheemMitha: -type fYalnızca normal dosyaları saymak gibi seçenekler ekleyebilirsiniz .
Mr Fooz

@FaheemMitha kolay çözümü find . -name "*.ear" -type fdosyalar içindir. -type ddizinler için çalışır.
anon58192932

112

-Exec veya -printf kullanmanız gerekir. Printf şu şekilde çalışır:

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

-exec daha güçlüdür ve isteğe bağlı komutları çalıştırmanıza izin verir - böylece dosya adını diğer bilgilerle birlikte yazdırmak için 'ls' veya 'wc'nin bir sürümünü kullanabilirsiniz. 'man find', dosya boyutundan çok daha fazlasını yapabilen printf için mevcut argümanları gösterecektir.

[değiştir] -printf resmi POSIX standardında değildir, bu nedenle sizin sürümünüzde desteklenip desteklenmediğini kontrol edin. Bununla birlikte, çoğu modern sistem GNU find'ı veya benzer şekilde genişletilmiş bir sürümü kullanacaktır, bu nedenle uygulanma olasılığı yüksektir.


Örneğiniz daha kesin görünüyor, ancak Solaris 10 üzerinde çalışma örneğini bulamıyorum.
Brian

Korkarım Solaris buluntu -printf'i hiç desteklemiyor: jrwren.wrenfam.com/blog/2006/10/07/solaris-find-sucks cs.bgu.ac.il/~arik/usail/man/solaris/ find.1.html Rahatsız olup olamayacağınızı bulmak için GNU'yu kurabilirsiniz, aksi takdirde exec veya | başkaları tarafından önerildiği gibi.
Leigh Caldwell

1
+1 Bu daha temiz görünüyor. Çıkışı biçimlendirmek için columnkomut eklemeyi tercih ederim . find . -name *.ear -printf "%p %k KB\n" | column -t
Amol

1
Bu cevap, kabul edilen cevaptan çok daha doğru bir cevaptır
tehditkar bir şekilde

2
-printfSeçenek OS X ya çalışmaz. Bkz stackoverflow.com/questions/752818/... .
abeboparebop

33

basit bir çözüm, find'da -ls seçeneğini kullanmaktır:

find . -name \*.ear -ls

Bu size her girişi normal "ls -l" biçiminde verir. Veya aradığınız belirli çıktıyı elde etmek için, bu:

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

Bu size dosya adını ve ardından KB cinsinden boyutu verecektir.


Bir lsseçeneği bile bilmiyordum , bu, cevaplar listesinde olduğundan çok daha yukarıda olmalı.
Prometheus

24

Gnu bul kullanarak, bence istediğiniz bu. Dizinleri değil (-tip f) tüm gerçek dosyaları bulur ve her biri için dosya adı (% p), bir sekme (\ t), kilobayt cinsinden boyut (% k), "KB" soneki ve ardından yeni satır (\ n).

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

Printf komutu işleri istediğiniz şekilde biçimlendirmezse, exec ve ardından her dosyada yürütmek istediğiniz komutu kullanabilirsiniz. Dosya adı için {} kullanın ve komutu noktalı virgülle (;) sonlandırın. Çoğu mermide, bu karakterlerin üçünün de ters eğik çizgi ile kaçması gerekir.

Burada, "ls -lh" kullanarak bunları bulup yazdıran basit bir çözüm, size boyutu insan tarafından okunabilir biçimde gösterecek (kilobayt için k, megabayt için M):

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

Yine bir başka alternatif olarak, "wc -c" dosyadaki karakter sayısını (bayt) yazdıracaktır:

find . -type f -exec wc -c \{\} \;

+1 -name '*.ear'Örneklerde yer almayanlar dışında , bu 1 numaralı cevap olmalıdır. Soruyu tam olarak yanıtlar, sözdiziminin anlamını açıklar ve birçok alternatif sunar.
OsakaWebbie

her satır için yeni bir komut çalıştırmadığı için bu cevap kabul edilmelidir, bu nedenle shyam
jirislav

Aslında bu doğru cevap olmalıdır. Ayrıca, find . -type f -printf '%k KB\t %p\n'yani önce dosya boyutunu yazdırmak, hizalama nedeniyle biçimlendirme açısından büyük olasılıkla daha iyi bir çıktı olacaktır.
myradio

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

Bu size tüm gereksiz şeyler yerine yalnızca dosya boyutunu verir.


wcbayt cinsinden boyuta ihtiyacınız varsa, bunun için daha iyi çalışır.
Alex

4

Awk, soruyu soranın tam olarak ne istediğini vermek için çıktıyı düzeltebilir. Solaris 10 sistemimde, -ls değerini ikinci alan olarak KB cinsinden yazdırır, bu nedenle:

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

Aksi takdirde, -exec ls -lh komutunu kullanın ve çıktıdan boyut alanını seçin. Yine Solaris 10'da:

% 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

Neden du -a kullanmıyorsunuz ? Örneğin

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

Mac'te çalışır


3

Find komutunun desteklemediği Mac OS X'te bununla uğraştım -printf.

Tüm dosyaların 'personel' olması için kuşkusuz 'gruba' dayanan bulduğum bir çözüm ...

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

Bu, ls uzun çıktısını üç jetona böler

  1. 'personel' metninden önceki şeyler
  2. dosya boyutu
  3. dosya adı

Ve sonra 2 ve 3 belirteçlerini çıkarır, yani çıktı bayt sayısıdır ve sonra dosya adıdır

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

1
findbrew install findutils
Bilmekte fayda var

2

Bu size aradığınız şeyi, biçimlendirme dahil olmalıdır (ör. Önce dosya adı ve daha sonra boyutu):

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

örnek çıktı (eskiden -iname "*.php"bir sonuç alırdım):

./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

Aşağıdaki komutları deneyin:

GNU stat:

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

BSD stat:

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

ancak statstandart değildir, duya wcda daha iyi bir yaklaşım olabilir:

find . -type f -name *.ear -exec sh -c 'echo "{} $(wc -c < {})"' ';'

1

Bunu deneyebilirsin:

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

Bu size bayt cinsinden boyutu verecektir. Ancak du komutu, KB için -k ve MB için -m parametrelerini de kabul eder. Size şöyle bir çıktı verecek

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




0

Toplam boyut almanız gerekiyorsa, işte bir komut dosyası önerisi

#!/bin/bash
totalSize=0

allSizes=`find . -type f -name *.ear -exec stat -c "%s" {} \;`

for fileSize in $allSizes; do
    totalSize=`echo "$(($totalSize+$fileSize))"`
done
echo "Total size is $totalSize bytes"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.