ottieni solo i nomi dei file ... ordinati per giorno di modifica
find + sort + cut approccio:
find . -regex ".*/[0-9.]+" -printf "%example@unixlinux.online %f\n" | sort | cut -d' ' -f2
-
%example@unixlinux.online- 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 "%example@unixlinux.online %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
$OLDDATAdopo). Pertanto si presuppone che i nomi dei file non contengano caratteri speciali (spazi bianchi o caratteri jolly\[*?). - Alcune versioni di
lspotrebbe 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 … -execexargsnon può essere d'aiuto qui, dal momento chelsdeve 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.