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 dalJan. 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:
- 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\[*?
). - Alcune versioni di
ls
potrebbe alterare i caratteri che non sono stampabili nella locale corrente. - Se la lunghezza totale dei nomi dei file è troppo lunga, riceverai un errore. (Notare che
find … -exec
exargs
non può essere d'aiuto qui, dal momento chels
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 dixargs
.)
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 difind
.##
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, comels -t
.
Notoriamente non esiste un modo semplice per farlo in modo affidabile con gli strumenti POSIX o anche con gli strumenti GNU e ksh.