Dosya listesi içeren bir dosyadan toplam dosya boyutunu alın


14

Toplam dosya boyutunu bilmek istediğim dosyaların listesini içeren bir dosyam var. Bunu yapmak için bir komut var mı?

İşletim sistemim çok temel bir linux (Qnap TS-410).

DÜZENLE:

Dosyadan birkaç satır:

/ paylaşım / arşiv / Bailey Testi / BD006 / 0.tga
/ paylaşım / arşiv / Bailey / BD007 / 1 sürüm 1.tga
/ paylaşım / arşiv / Bailey 2 / BD007 / example.tga


Bize birkaç örnek satır verin.
EEAA

Eklenen dosyadan örnek.
Nicolas

Bu bir çeşit NAS, değil mi? Yüklü meşgul kutunuz var mı?
cjc

Evet öyle ve sanırım zaten kurulu, neden?
Nicolas

Yanıtlar:


13

Meşgul kutusunda böyle bir şey işe yarayacağına inanıyorum:

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

Sizinle aynı ortama sahip değilim, ancak dosya adlarında boşluklarla ilgili sorunlarla karşılaşırsanız böyle bir şey de işe yarayacaktır:

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

Düzenleme 1 :
@ stew aşağıdaki yazısında doğrudur, du tam dosya boyutunu değil, disk kullanımını gösterir. Meşgul kutusu davranışını değiştirmek için -a bayrağını kullanır, bu nedenle şunu deneyin: du -a "$file"tam dosya boyutu için çıktıyı ve davranışı karşılaştırın.


1
Girişiniz için teşekkürler, ilk komut geri döner /usr/bin/du: Argument list too long(dosyamda neredeyse 80.000 satır). İkinci komutun, enter tuşuna bastığımda bana daha fazla bir şey mi beklediğini soruyor mu?
Nicolas

Ortamınızla söylemek zor. Normal komut istemi mi, yoksa sadece yanıp sönen istem mi? Eğer ikincisi sadece sonucu beklemek yavaş olabilir, eğer onun bir "giriş istemi" bazı karakter kaçırmış olabilir? Ve eğer bilmediğim normal bir istemse, yazmadan önce oldukça kapsamlı bir şekilde test ettim. :(
Mattias Ahnberg

Aşağıdakileri yaptığımda bir "giriş istemi" dir cat tgafiles.txt | while read file;do du "$file" done | awk '{i+=$1} END {print i}'. teşekkürler mattias
Nicolas

1
Ah! Her şeyi bir satıra koyarsanız, başka bir satıra ihtiyacınız vardır; bunun gibi: cat tgafiles.txt | while read file;do du "$file";done | awk '{i+=$1} END {print i}'(yani daha önce yapılmadan).
Mattias Ahnberg

Bulun! Mükemmel çalıştı, şerefe! (bu hatayı kendim
Nicolas

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

-c"toplam boyut" satırı ekler;
tail -1son satırı alır (toplam boyutta);
cut -f 1"toplam" kelimesini keser.


Bu, ikili argüman listesi ile çok uzun süre başarısız oluyor. Filelistim büyük. Xargs ile aşağıdaki cevap en kolay çözüm gibi görünüyor.
Syclone0044

4

Linux araçlarınızın bunu yapabildiğini bilmiyorum, ama:

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

Yapın, xargs sınırlayıcıyı yeni satır karakteri olarak ayarlayacak ve du sizin için büyük bir toplam üretecektir.

Http://busybox.net/downloads/BusyBox.html dosyasına bakıldığında, "busybox du" genel toplam seçeneğini destekleyecek gibi görünüyor, ancak "busybox xargs" özel sınırlayıcıları desteklemeyecek gibi görünüyor.

Yine, araç setinizden emin değilim.


İşte sonuç:xargs: invalid option -- d
Nicolas

Harika: NAS'ın meşgul kutusu linux ile çalışmak bir McGuyver bölümü gibi, bazı tuval, sopa ve sicimden çalışan bir uçak inşa etmeye çalışıyor.
cjc

Bununla ilgili olarak, farklı bir makinede yer varsa: ilgilendiğiniz tüm dosyaları tamamen işlevsel olan başka bir linux'a kopyalayın ve sonra Stew'ın çözümünü orada çalıştırın. Bunu yapmak, busybox'ın bu tür bir şey yapabileceğini anlamaya çalışmaktan çok daha kolay olabilir.
cjc

1
Bence cevap en iyisi. Kısa ve bu konudaki diğer cevaplardan çok daha hızlı.
zymhan

İyi cevap. Dışarıda bırakmak isteyebilirsiniz -cçünkü xargs du, filelist yeterince uzunsa birden fazla çağrı yapar ve birkaç dutoplam üretir .
qwr

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

Bu Mattias Ahnberg'in çözümüne benzer. "Read" komutunu kullanmak, dosya adları / boşluklu dizinlerle ilgili sorunları çözer. Kullandığım statyerine dudosya boyutu elde etmek. du dosya boyutu yerine diskte kullandığı oda miktarını alıyor, ki bu farklı olabilir. Dosya sisteminize bağlı olarak, 1 baytlık bir dosya diskte 4k (veya blok boyutu ne olursa olsun) işgal eder. Yani 1 baytlık bir dosya için stat 1 bayt ve du 4k diyor.


Dosya boyutu ve disk boyutu hakkında iyi yorum!
Mattias Ahnberg

Gerçekten ilginç bir yorum, ne yazık ki benim linux statkomutu bilmiyor :stat: command not found
Nicolas

"Meşgul kutusu stat" demeniz gerekebilir.
cjc

stat: applet not foundbu durumda diyor
Nicolas

4

Soruna başka bir çözüm daha:

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

Benim için (cygwin'de) du -bcçok daha hızlı çalışıyor.
qwr

2

Bunun gibi bir şey deneyin:

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

Yollardaki boşluklarla düzgün bir şekilde başa çıkmak için:

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

girişiniz için teşekkürler, ne yazık ki benim dosya içindeki dizinlerde boşlukları bir "\" ile kaçan değil bir sorun olduğunu düşünüyorum, bu nedenle dosya listesi üzerinden giderken kırılır.
Nicolas

Metin dosyası listesini atlayabilir ve sadece çıkıştan çıkarabilir findmisiniz?
EEAA

ne yazık ki liste çok uzun, 79159 dosya satırı (tam yol), bu yüzden bir dosyaya çıktı; belki bulgunun sonucundan kaçma hakkında bir tartışma ekleyebilirim?
Nicolas

Linux sistemimdeki bulgu ile "-print0" argümanı yok
Nicolas

@Nicolas - bunun nedeni findgerçek findikili yerine meşgul kutusunun soyulmuş kullanılmasıdır .
EEAA

1

cat docs.txt | xargs -d \\n du -sk | awk '{total+=$1} END{print total}'

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.