GNU/Linux >> Linux Esercitazione >  >> Linux

Come ordinare i risultati di Find statement per data?

ottieni solo i nomi dei file ... ordinati per giorno di modifica

find + sort + cut approccio:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
  • %[email protected] - Ora dell'ultima modifica del file, dove @ è secondi dal Jan. 1, 1970, 00:00 GMT, con parte frazionaria

  • %f - Il nome del file con tutte le directory iniziali rimosse (solo l'ultimo elemento)

Per ordinare in ordine decrescente:

find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2

Il tuo metodo può essere adattato per funzionare in casi semplici. Il problema principale che stai affrontando è che stai trasmettendo input a ls , ma ls non prende alcun input. ls accetta argomenti della riga di comando. Quindi devi passare l'output di find come argomenti a ls , con una sostituzione di comando. Inoltre, in caso di corrispondenza con una directory, passare -d a ls per elencare la directory stessa e non il suo contenuto.

OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))

Solo in casi semplici, perché ci sono due restrizioni:

  1. Ciò si basa su una sostituzione di comando non quotata (così come l'uso di $OLDDATA dopo). Pertanto si presuppone che i nomi dei file non contengano caratteri speciali (spazi bianchi o caratteri jolly \[*? ).
  2. Alcune versioni di ls potrebbe alterare i caratteri che non sono stampabili nella locale corrente.
  3. Se la lunghezza totale dei nomi dei file è troppo lunga, riceverai un errore. (Notare che find … -exec e xargs non può essere d'aiuto qui, dal momento che ls deve essere eseguito una sola volta per ottenere l'ordine corretto dei nomi dei file. Tutto quello che potrebbero fare è nascondere gli errori e produrre un output che non è correttamente ordinato — e alterare qualche carattere in più, nel caso di xargs .)

Un modo robusto e semplice per farlo è usare zsh. Ha la capacità di ordinare le corrispondenze con caratteri jolly, grazie ai qualificatori glob.

setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
  • Poiché questo non chiama nessun altro programma, non vi è alcun limite di lunghezza oltre alla memoria disponibile e nessun rischio di alterazione del nome del file in qualsiasi momento.
  • Il risultato è un elenco di stringhe (ogni stringa è un nome di file), non una stringa, quindi va in una variabile di matrice.
  • **/ attraversa le sottodirectory in modo ricorsivo, evitando l'uso di find .
  • ## significa "uno o più dei precedenti" nella sintassi glob estesa zsh, è analogo a + nella sintassi regex (estesa).
  • (om) è un qualificatore glob per ordinare i file in base all'ora di modifica, come ls -t .

Notoriamente non esiste un modo semplice per farlo in modo affidabile con gli strumenti POSIX o anche con gli strumenti GNU e ksh.


Linux
  1. Come trovare e ordinare i file in base alla data e all'ora di modifica in Linux

  2. Come trovare file di grandi dimensioni Linux con i comandi find e du

  3. Come fare A Ls e quindi ordinare i risultati per data di creazione?

  4. Linux – Come trovare la data di creazione del file?

  5. In che modo la data di Coreutil riesce a ottenere risultati così strani?

Come trovare ed elencare in modo ricorsivo i file per data in Linux

Come trovare l'indirizzo IP in Linux

Come trovare il nome host in Linux

Come trovare la data e l'ora esatte di installazione del tuo sistema operativo Linux

Come trovare la data e l'ora di installazione del sistema operativo Linux

Come trovare file in Debian