Wyświetl listę plików większych niż {rozmiar} posortowanych według daty

27

Chcę rozwiązać problem „wypisz 10 najlepszych plików w bieżącym katalogu powyżej 20 MB”.

Dzięki lsmogę zrobić:

ls -Shal |head

aby uzyskać 10 największych plików i:

ls -halt |head

aby uzyskać 10 najlepszych najnowszych plików

Z find mogę zrobić:

find . -size +20M

Aby wyświetlić listę wszystkich plików powyżej 20 MB w bieżącym katalogu (i podkatalogach, których nie chcę).

Czy jest jakiś sposób, aby wyświetlić listę dziesięciu najnowszych plików w określonym rozmiarze, najlepiej używając ls?

Eoghan
źródło

Odpowiedzi:

24

Opcja „bieżącego katalogu” findto -maxdepth 1. Cała linia poleceń dla twoich potrzeb to:

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

lub

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
Rajish
źródło
8

Uwaga: Działa to dla GNU-find, ale nie dla wszystkich innych znalezisk.

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

Zaczyna się jak @Rajish, ale za pomocą printfpolecenia od findokreśla format wyjściowy. Istnieją 3 formaty związane z czasem, atime, ctime i mtime - %Tdla mtime %Ai %Cdla innych formatów.

@określa format czasu w sekundach od epoki. %fjest dla nazwy pliku, \ndla nowego wiersza między 2 plikami.

Następnie sortowanie według liczb w odwrotnej kolejności daje najpierw najmłodsze pliki, a my bierzemy 20 wierszy¹ z head.

W końcu sedsłuży do wyrzucenia informacji o czasie.

¹) ponieważ headdziała wiersz po wierszu, pojedynczy plik z ponad 20 nowymi liniami w nazwie, co jest nieco niezwykłe, ale nie zabronione, może uszkodzić dane wyjściowe, jeśli należą do pierwszych 20 dopasowań. Jeśli zdarzy ci się mieć takie pliki, spróbuj się ich pozbyć - cóż, zmień ich nazwę. Często stanowią problem dla prostych skryptów.

nieznany użytkownik
źródło
1
Jeśli używasz file„s -lspolecenia, znaki specjalne zostaną wydrukowane jako znaki backslash-uciekł: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Dodatkowo format będzie wyglądał ls -l, EoghanM i -ltak określono .
manatwork
printfdziała tylko dla określonych dystrybucji GNU.
Brethlosze
%T+generuje znaczniki czasowe czytelne dla człowieka, 2018-11-06+13:37:54.4606466460które również można sortować według sort(bez -n), patrz: unix.stackexchange.com/questions/29899/…
Ciro Santilli 事件 改造 中心 法轮功 六四 事件
5

Globalne kwalifikatory Zsh ułatwiają to. Do .wybiera kwalifikacyjne tylko zwykłe pliki, Lm+20pliki zaznaczane, że są co najmniej 20MB plus jeden bajt długi; aby dołączyć pliki o długości dokładnie 20 MB, użyj L+20971519. Następnie omsortuje, zmniejszając czas modyfikacji i [1,10]ogranicza ekspansję do pierwszych 10 dopasowań. Nadal potrzebujesz -topcji, lsjeśli chcesz wyświetlić listę plików według daty; lub możesz przekazać pliki do innego polecenia (najpierw najmłodsze). Aby przekazać pliki do innego polecenia, poczynając od najstarszego pliku, użyj Omsortowania poprzez zwiększenie czasu modyfikacji i [-10,-1]wyodrębnienia ostatnich 10 dopasowań.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
Gilles „SO- przestań być zły”
źródło
2

Myślę, że może to być lepszy sposób na rozwiązanie problemu ...

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

Aby pozbyć się błędów podczas wyszukiwania, próbuj uzyskać dostęp do plików, do których odczytu nie masz uprawnień, które możesz chcieć dodać

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
Dominic Williams
źródło
1

Spowoduje to wydrukowanie tylko 10 określonych plików, niezależnie od osadzonych znaków nowej linii w nazwach plików. Używa systemu plikówinodes

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
Peter.O
źródło
-1

Dziękuję za wszystkie odpowiedzi. Poszedłem za:

ls -halt | grep "M " |head

Mimo że rezygnuje z 20 megabajtów na korzyść czegokolwiek ponad megabajt (i mniej niż gigabajt), łatwo go zapamiętać i zachowuje czytelny dla człowieka element wielkości plików.

Eoghan
źródło
4
Należy nie próbować analizować dane wyjściowe ls, to pokazuje reprezentację plików, nic więcej. W przypadku prostych nazw plików dane wyjściowe są w większości równoważne nazwie pliku, ale nie należy na nim polegać.
Chris Down,
To prawda, jestem pewien, ale jeśli chodzi o ludzkiego użytkownika (a dane wyjściowe nie są przesyłane w innym miejscu), ten jest łatwiejszy do zapamiętania, ponieważ można go łatwiej połączyć ze znanych prostych narzędzi tldp.org/LDP/GNU-Linux- Narzędzia-Podsumowanie / html / c1089.htm
EoghanM