Ordina i file in base al tempo di modifica


8

Ho visto molte domande e risposte qui usando una costruzione sulla falsariga di

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

o

ls -t | while read i; do

Ora so che non dovresti usare ls negli script perché si rompe facilmente; ma non riesco a trovare un modo migliore di operare sui file dall'ultima modifica all'ultima modifica (o viceversa).

Posso usare qualcosa del tipo:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... ma questo si interromperà comunque con tutti i file che hanno una nuova riga nei loro nomi ed è molto più brutto da avviare. Esiste un modo migliore?

Risposte:


8

"Non usare ls negli script" è un problema con POSIX ls "solo"; per GNU, vedi --quoting-style=.

L'ordinamento GNU risolve il problema con --zero-terminated.

Se deve essere compatibile, è possibile utilizzare find ... -execper passare un nome di file alla volta a uno script che esegue l'escape. Se è disponibile almeno bash:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

Ah, --zero-terminatedgrazie per questo, vorrei poterti dare ancora più punti!
evilsoup,

... OK, sono un po 'confuso da info ls: se volessi uno script antiproiettile con ls, quale --quoting-styledovrei usare?
evilsoup,

@evilsoup Penso che --quoting-style=escapesia il modo di scegliere.
Hauke ​​Laging,

Ora, per creare alcuni file con nuove righe nei loro nomi per testarlo: P
evilsoup

1
Inoltre: mi imbatto in un caso estremo in cui GNU ls --quoting-stylenon riesce mai (per analizzare lo scopo) perché cita solo i nomi dei file: quando hai uno spazio nel nome di un gruppo. Ok, è un caso molto strano, ma è apparso in Cygwin Bash Shell, qui hai nomi di gruppi come Domain Users.
DavAlPi,

4

Il modo più semplice è usare zsh. Il qualificatore glob om ordina le partite in ordine cronologico inverso; utilizzare Omper ordine cronologico.

for x in /path/to/dir/*(Nom); do …

Il Nqualificatore glob provoca l'espansione del modello in un elenco vuoto se la directory è vuota. Crea questo *(DNom)per abbinare i file punto.


1
Dang, questa è la prima volta che sono tentato di preoccuparmi di guardare altre conchiglie - è molto bello.
evilsoup,
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.