{Size} 'den büyük dosyaları tarihe göre sıralı olarak listele


27

'Geçerli dizindeki en son 10 dosyayı 20 MB'ın üzerinde listele' sorununu çözmek istiyorum.

İle lsYapabileceğim:

ls -Shal |head

en büyük 10 dosyayı almak ve

ls -halt |head

En yeni 10 dosyayı almak için

Bul ile yapabileceğim:

find . -size +20M

Geçerli dizinde (ve istemediğim alt dizinlerde) 20 MB’in üzerindeki tüm dosyaları listelemek için.

En son on dosyayı, belirli bir boyuta göre listelemek için herhangi bir yolu var mı ls?

Yanıtlar:


24

İçin 'Geçerli dizin' seçeneği findolduğunu -maxdepth 1. İhtiyaçlarınız için bütün komut satırı:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

veya

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

Not: Bu GNU bulması için işe yarayacak, fakat diğerlerinin hepsi bulunmayacak.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

@Rajish gibi başlayarak, ancak çıkış biçimini belirtmek için printfkomutunu kullanarak find. Orada 3 zamanla ilgili formatlar şunlardır atime, ctime ve mtime - %Tmtime için olduğu, %Ave %Cdiğer formatlar içindir.

@zaman biçimini dönemden bu yana saniye cinsinden belirtmektir. %fdosya adı için, \n2 dosya arasındaki yeni satır için.

Daha sonra sırayla numaraya göre sıralama, en genç dosyaları verir ve biz de 20 satır alırız head.

Sonunda, sedzaman bilgisini atmak için kullanılır.

¹) headsatır satır çalıştığından, adında 20'den fazla yeni satır bulunan ve biraz sıradışı olan ancak yasaklanmayan tek bir dosya, ilk 20 karşılaşmaya aitse çıktısını bozabilir. Eğer bu tür dosyalara sahipseniz, lütfen onlardan kurtulmaya çalışın - isimlerini değiştirmek için. Genellikle basit scriptler için bir problem olacaktır.


1
Eğer kullanırsanız file'ın -lskomutu, özel karakterler ters eğik çizgi bulunan karakterleri olarak basılacaktır: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Ek olarak, biçim gibi ls -lgözükecek, EoghanM da -lyine belirtilmiş .
Manatwork 13:11

printfsadece belirli GNU dağıtımları için çalışır.
Brethlosze

%T+gibi, insanlar tarafından okunabilir zaman damgalarını üretir 2018-11-06+13:37:54.4606466460ile de sıralanabilir olan sort(olmadan -n), bakınız: unix.stackexchange.com/questions/29899/...
Ciro Santilli新疆改造中心法轮功六四事件

5

Zsh'nin glob elemeleri bunu kolaylaştırıyor. .Eleme seçer sadece normal dosyalar, Lm+20en az 20MB artı uzun bir bayt altındadır seçer dosyaları; 20 MB uzunluğunda olan dosyaları dahil etmek için kullanın L+20971519. Daha sonra omdeğişiklik zamanını azaltarak sıralama yapar ve [1,10]genişlemeyi ilk 10 eşleşme ile sınırlar. Dosyaları tarihe göre listelemek istiyorsanız yine de -tseçeneğiniz vardır ls; veya dosyaları başka bir komuta iletebilirsiniz (önce en genç). Dosyaları önce en eski dosyayla başka bir komuta geçirmek için, Omdeğişiklik zamanını artırarak sıralamak [-10,-1]ve son 10 eşleşmeyi çıkarmak için kullanın.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

Bence bu sorunu çözmenin daha iyi bir yolu olabilir ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Bulma sırasında okuma izniniz olmayan dosyalara erişmeye çalışırken herhangi bir hatadan kurtulmak için eklemek isteyebilirsiniz

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

Bu, dosya adlarındaki tümleşik yeni satır karakterlerinden bağımsız olarak yalnızca belirtilen 10 dosyayı basar. Dosya sistemini kullanırinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

Tüm cevaplar için teşekkürler. Gittiğim şey şu:

ls -halt | grep "M " |head

20 megabayttan bir megabayt (ve bir gigabaytın altındaki) bir şey lehinde olmasına rağmen, dosya boyutlarındaki insan tarafından okunabilen öğeyi hatırlamak ve korumak kolaydır.


4
Sen gerektiğini değil çıkışını ayrıştırmak girişiminde lshiçbir şey daha, size dosyaların bir temsilini gösterir. Basit dosya adları için, çıktı çoğunlukla dosya adına eşdeğer olur, ancak buna güvenmemeniz gerekir.
Chris Down

Bu doğru, eminim, ama bir insan kullanıcısı açısından (ve çıktı başka bir yerde kullanılmıyorsa), bilinen basit araçlardan daha kolay bir araya getirilebileceğinden hatırlanması daha kolaydır tldp.org/LDP/GNU-Linux- Araçlar-Özet / html / c1089.htm
EoghanM
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.