GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso trovare il file più vecchio in un albero di directory

Funziona (aggiornato per incorporare il suggerimento di Daniel Andersson):

find -type f -printf '%T+ %p\n' | sort | head -n 1

Questo è un po' più portabile e perché non si basa su GNU find estensione -printf , quindi funziona anche su BSD / OS X:

find . -type f -print0 | xargs -0 ls -ltr | head -n 1

L'unico aspetto negativo qui è che è in qualche modo limitato alla dimensione di ARG_MAX (che dovrebbe essere irrilevante per la maggior parte dei kernel più recenti). Quindi, se ce ne sono più di getconf ARG_MAX caratteri restituiti (262.144 sul mio sistema), non ti dà il risultato corretto. Inoltre, non è conforme a POSIX perché -print0 e xargs -0 non lo è.

Alcune altre soluzioni a questo problema sono descritte qui:Come posso trovare il file più recente (il più recente, il più antico, il più vecchio) in una directory? – Wiki di Greg


È garantito che i seguenti comandi comandi funzionino con qualsiasi tipo di nome di file strano:

find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat

find -type f -printf "%[email protected] %T+ %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'

stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"

Utilizzando un byte nullo (\0 ) invece di un carattere di avanzamento riga (\n ) assicura che l'output di find sia ancora comprensibile nel caso in cui uno dei nomi di file contenga un carattere di avanzamento riga.

L'-z switch fa in modo che sia sort che grep interpretino solo i byte nulli come caratteri di fine riga. Dato che non esiste un tale interruttore per la testa, usiamo grep -m 1 invece (solo un'occorrenza).

I comandi sono ordinati per tempo di esecuzione (misurato sulla mia macchina).

  • Il primo comando sarà il più lento poiché deve prima convertire l'mtime di ogni file in un formato leggibile dall'uomo e quindi ordinare quelle stringhe. Piping to cat evita di colorare l'output.

  • Il secondo comando è leggermente più veloce. Sebbene esegua ancora la conversione della data, l'ordinamento numerico (sort -n ) i secondi trascorsi dall'epoca Unix sono un po' più veloci. sed cancella i secondi dall'epoca Unix.

  • L'ultimo comando non esegue alcuna conversione e dovrebbe essere significativamente più veloce dei primi due. Il comando find in sé non visualizzerà l'mtime del file più vecchio, quindi è necessario stat.

Pagine man correlate:find – grep – sed – sort – stat


Linux
  1. Come trovare il file più vecchio in un albero di directory in Linux

  2. Come posso trovare la versione di Fedora che uso?

  3. Come posso trovare tutte le estensioni di file distinte in una gerarchia di cartelle?

  4. come trovare il proprietario di un file o di una directory in python

  5. Come posso creare un file in ogni cartella?

Come trovare la dimensione totale di una directory in Linux

Come trovo la posizione MySQL my.cnf

Come posso copiare in modo ricorsivo i file per estensione di file, preservando la struttura delle directory?

Come posso rimuovere un file o una directory chiamata \?

Come posso copiare un albero di directory ma non i file in Linux?

Non riesci a trovare .so nella stessa directory dell'eseguibile?