it-swarm-eu.dev

Seznam souborů větších než {size} seřazených podle data

Chci vyřešit problém 'uveďte seznam 10 nejaktuálnějších souborů v aktuálním adresáři nad 20 MB'.

S ls mohu dělat:

ls -Shal |head

získat 10 největších souborů a:

ls -halt |head

získat 10 nejaktuálnějších souborů

S najít mohu udělat:

find . -size +20M

Chcete-li zobrazit všechny soubory přes 20 MB v aktuálním adresáři (a podadresářích, které nechci).

Existuje nějaký způsob, jak zobrazit seznam prvních deseti nejnovějších souborů v určité velikosti, nejlépe pomocí ls?

29
EoghanM

Možnost 'aktuální adresář' pro find je -maxdepth 1. Celý příkazový řádek pro vaše potřeby je:

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

nebo

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

Poznámka: Toto bude fungovat pro GNU-find, ale ne pro všechny ostatní.

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

Začínáme jako @Rajish, ale pomocí příkazu printf od find určete výstupní formát. Existují 3 formáty související s časem, atime, ctime a mtime - %T je pro mtime, %A a %C jsou pro jiné formáty.

@ je určení časového formátu v sekundách od epochy. %f je pro název souboru, \n pro nový řádek mezi 2 soubory.

Poté třídění podle čísla v obráceném pořadí poskytne nejdříve nejmladší soubory a vezmeme 20 řádků¹ s head.

Nakonec se používá sed k vyhazování časových informací.

¹) protože head pracuje řádek po řádku, jediný soubor s více než 20 novými řádky v názvu, který je trochu neobvyklý, ale není zakázán, může poškodit výstup, pokud patří mezi prvních 20 zápasů. Pokud takové soubory máte, zkuste se jich zbavit - dobře, změňte jejich jméno. Často budou problémem pro jednoduché skripty.

8
user unknown

Zsh's kvalifikátory globů to usnadňují. The . kvalifikátor vybere pouze běžné soubory, Lm+20 vybere soubory, které jsou dlouhé nejméně 20 MB plus jeden bajt; Chcete-li zahrnout soubory, které jsou přesně 20 MB dlouhé, použijte L+20971519. Poté om seřadí podle zkrácení doby modifikace a [1,10] omezuje rozšíření na prvních 10 zápasů. Stále potřebujete -t možnost ls, pokud chcete seznam souborů podle data; nebo můžete soubory předat jinému příkazu (nejdříve nejmladší). Chcete-li nejprve předat soubory jinému příkazu s nejstarším souborem, použijte Om k seřazení podle prodloužení doby modifikace a [-10,-1] extrahovat posledních 10 zápasů.

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

Myslím, že by to mohl být lepší způsob, jak problém vyřešit ...

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

Chcete-li se zbavit jakýchkoli chyb při hledání pokusů o přístup k souborům, které nemáte oprávnění ke čtení, možná budete chtít přidat

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

Tím se vytiskne pouze určených 10 souborů bez ohledu na vložené znaky nového řádku v názvech souborů. Používá souborový systém inodes

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

Díky za všechny odpovědi. Pro co jsem šel, jsou následující:

ls -halt | grep "M " |head

Ačkoli se vzdává 20 megabajtů ve prospěch všeho přes megabajt (a pod gigabajt), je snadné si zapamatovat a zachovat lidskou čitelnou část velikosti souborů.

0
EoghanM