Elenca i file più grandi di {size} ordinati per data


27

Voglio risolvere il problema "elenca i 10 file più recenti nella directory corrente di oltre 20 MB".

Con lsposso fare:

ls -Shal |head

per ottenere i primi 10 file più grandi e:

ls -halt |head

per ottenere i primi 10 file più recenti

Con find posso fare:

find . -size +20M

Per elencare tutti i file oltre i 20 MB nella directory corrente (e nelle sottodirectory, che non desidero).

C'è un modo per elencare i primi dieci file più recenti su una determinata dimensione, preferibilmente usando ls?

Risposte:


24

L'opzione 'directory corrente' per findè -maxdepth 1. L'intera linea di comando per le tue esigenze è:

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

o

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

8

Nota: questo funzionerà per GNU-find, ma non per tutti gli altri.

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

Iniziando come @Rajish, ma usando il printfcomando da findper specificare il formato di output. Ci sono 3 formati relativi al tempo, atime, ctime e mtime - %Tè per mtime %Ae %Csono per gli altri formati.

@è specificare il formato temporale in secondi dall'epoca. %fè per il nome file, \nper una nuova riga tra 2 file.

Quindi l'ordinamento per numero in ordine inverso dà prima i file più giovani e prendiamo 20 righe¹ con head.

Alla fine, sedviene utilizzato, per buttare via le informazioni sul tempo.

¹) poiché headfunziona riga per riga, un singolo file con più di 20 nuove righe nel nome, che è un po 'insolito, ma non proibito, può corrompere l'output se appartiene alle prime 20 corrispondenze. Se ti capita di avere tali file, prova a sbarazzartene - beh, per cambiarne il nome. Saranno spesso un problema per semplici script.


1
Se si utilizza file's -lscomando, i caratteri speciali vengono stampati come caratteri backslash escape: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Inoltre il formato sarà simile ls -l, EoghanM specificato anche -lcomunque.
arte

printffunziona solo per specifiche distribuzioni GNU.
Brethlosze,

%T+genera timestamp umani leggibili come quelli 2018-11-06+13:37:54.4606466460che sono anche ordinabili da sort(senza -n), vedi: unix.stackexchange.com/questions/29899/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

5

Le qualificazioni glob di Zsh lo rendono facile. Il .qualificatore seleziona solo i file regolari, Lm+20seleziona i file che sono lunghi almeno 20 MB più un byte; per includere file lunghi esattamente 20 MB, utilizzare L+20971519. Quindi omordina diminuendo il tempo di modifica e [1,10]limita l'espansione alle prime 10 partite. Hai ancora bisogno -tdell'opzione lsse vuoi elencare i file per data; oppure puoi passare i file a qualche altro comando (prima il più giovane). Per passare prima i file a un altro comando con il file più vecchio, utilizzare Omper ordinare aumentando il tempo di modifica ed [-10,-1]estrarre le ultime 10 corrispondenze.

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

2

Penso che questo potrebbe essere un modo migliore per risolvere il problema ...

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

Per sbarazzarsi di eventuali errori mentre find tenta di accedere ai file che non hai i permessi di lettura che potresti voler aggiungere

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

1

Ciò stamperà solo i 10 file specificati, indipendentemente da eventuali caratteri di nuova riga incorporati nei nomi dei file. Utilizza il file systeminodes

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

Grazie per tutte le risposte Quello che ho scelto è il seguente:

ls -halt | grep "M " |head

Anche se rinuncia a 20 Megabyte a favore di qualsiasi cosa oltre un megabyte (e sotto un gigabyte), è facile da ricordare e conserva l'elemento leggibile dall'uomo delle dimensioni dei file.


4
Si dovrebbe non tentare di analizzare l'output di ls, vi mostra una rappresentazione di file, niente di più. Per i nomi di file semplici, l'output sembra essere per lo più equivalente al nome del file, ma non dovresti fare affidamento su di esso.
Chris Down,

È vero, ne sono certo, ma in termini di un utente umano (e l'output non viene convogliato altrove), questo è più facile da ricordare in quanto può essere assemblato più facilmente dai semplici strumenti noti tldp.org/LDP/GNU-Linux- Strumenti-Riepilogo / html / c1089.htm
EoghanM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.