Il modo migliore per elencare 100 primi file in una directory ordinata per ora


12

Quale sarebbe il modo migliore per elencare 100 primi file in una directory ordinata in base al timestamp creato (prima il più vecchio). La directory è piuttosto grande (circa 100000 file).

ls reindirizzati al testa prende un lungo periodo di tempo terribile per completare.

Modificare:

  • Il filesystem è ext3.
  • limitare il numero di file nella cartella non vale la pena, poiché si tratterà di una rara operazione di "pulizia" e i file vengono generati da un software di terze parti.
  • Utilizzando il tempo di modifica del file , invece del tempo di creazione fornisce una soluzione accettabile.


1
Se si tratta di un'operazione di pulizia, forse quello che vuoi è solo find -mtime +<number of days> -deleteripulire tutti i file più vecchi di una certa età. Ciò significa che non è necessario alcun tipo.
Mikel,

Risposte:


14

Tu dici che " ls reindirizzati al capo richiede un lungo periodo di tempo terribile completa".

La causa di ciò non è ls, ma il numero di file nella tua directory. Se hai 100.000 file in una singola directory, qualsiasi modo di risolvere questo problema dovrebbe ottenere informazioni su tutti i 100.000 file prima ancora di pensare a ordinarli o stampare qualsiasi output.

Se impiega troppo tempo, la vera soluzione è dividere i file su più directory.

Se non riesci a distribuire i file su più directory, c'è un modo per restringere il numero di file da considerare ? ad es. se i nomi dei file includono una data, forse puoi includere un carattere jolly in modo che il sistema non debba ordinare 100.000 file. O forse sono numerati in sequenza? (Questo può o non può aiutare, ma vale la pena provare.)

Quante volte stai cercando di farlo? Forse vale la pena salvare / memorizzare nella cache l'output per il riutilizzo .


Ora una domanda.

Sei sicuro di voler dire "tempo di creazione" e non "tempo di cambio" ? La maggior parte degli strumenti può visualizzare solo "tempo di cambio", non "tempo di creazione".

Ottenere "tempo di creazione" è una novità, che richiede un filesystem ext4 e alcuni strumenti che non sono facili da installare.


Se vuoi cambiare il tempo

Change time (in breve ctime) indica l'ora dell'ultima modifica degli attributi del file.

ls -c ordina per ctime.

Volete l'uscita in ordine crescente, non decrescente, quindi è necessario invertire anche l'uscita con l' -ropzione.

Quindi potresti farlo in questo modo:

ls -cr | head -n 100

Una soluzione più lunga allo stesso problema usando stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

ma funziona più lentamente rispetto ls -cral mio sistema.


Se vuoi il tempo di modifica

Tempo di modifica (mtime in breve) indica l'ora dell'ultima modifica del contenuto del file.

ls -t ordina per mtime.

Passare ls -cra ls -tr(opzione migliore) o passare stat -c $'%Z\t%n'a stat -c $'%Y\t%n'.


Se hai bisogno di tempo di creazione

(crtime in breve)

Questo è più difficile.

Innanzitutto, assicurati che la directory sia su un filesystem formattato usando ext4. Puoi usare tune2fs -l <device name>per controllare questo.

Quindi, c'è un nuovo statformato chiamato %W, che può aiutarti qui. Per ottenerlo, devi scaricare una versione di GNU Coreutils rilasciata nell'ottobre 2010 o successivamente, estrarla, compilarla e installarla.

Quindi, a seconda del kernel, questo potrebbe funzionare (non l'ho provato).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Guarda anche:


Se ricevi errori "'$\t'

La '$\t'notazione richiede basho zsh: non funzionerà in dasho shsu Ubuntu. Se hai davvero bisogno di usare quelle shell, dovrai cambiare qualsiasi \tin Ctrl+ V, Tabe rimuovere il lead $da appena prima del preventivo di apertura.


È possibile che non stia eseguendo ext4. Eseguo Ubuntu 10.04 su tutte le mie macchine, ma eseguo JFS su più unità. AFAIK JFS supporta i timestamp di creazione.
jwernerny,

Infatti. Sappiamo che non è supportato su ext3 ed è supportato su ext4. Una rapida ricerca suggerisce che potrebbe funzionare con zfs o FreeBSD ufs, ma nessuno dei due è comune su Ubuntu! Non sono sicuro di jfs o xfs o altro. Sarei felice di saperne di più se riesci a trovare informazioni / collegamenti.
Mikel,

Grazie per quella risposta molto completa e per il sottile promemoria da scrivere domande più specifiche;) "Find" si è rivelato essere un vincitore in termini di prestazioni, il tipo fs si è rivelato ext3.

2

Un altro modo se scoperto di fare cose oggi potrebbe essere rilevante per i tuoi problemi di prestazioni:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

In teoria ciò dovrebbe iniziare a produrre molto più velocemente, ma immagino che dipenda da dove provenga il ritardo. Potrebbe volerci lsmolto tempo per ordinare i file.


Ne dubito. headin realtà esce non appena ha letto abbastanza input. Prova a correre entrambi con timenella parte anteriore. La headversione è comunque molto più veloce sul mio sistema.
Mikel,
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.