Elencare i file in ordine cronologico con gli spazi nei nomi dei file
Domanda
sto iniziando con un file contenente un elenco di centinaia di file (percorsi completi) in un ordine casuale. Vorrei elencare i dettagli delle ultime dieci file in tale elenco. Questo è il mio tentativo ingenuo:
$ ls -las -t `cat list-of-files.txt` | head -10
che funziona, a patto che nessuno dei file hanno spazi, ma non riesce se lo fanno come i file sono suddivisi presso gli spazi e trattati come file separati. File "ciao mondo" mi dà:
ls: hello: No such file or directory
ls: world: No such file or directory
Ho cercato citando i file nel file originale lista-dei-file, ma il qui-documento, divide ancora i file fino agli spazi i nomi dei file, trattando le virgolette come parte dei nomi di file:
$ ls -las -t `awk '{print "\"" $0 "\""}' list-of-files.txt` | head -10
ls: "hello: No such file or directory
ls: world": No such file or directory
L'unico modo che posso pensare di fare questo, è quello di ls ogni singolo file (utilizzando xargs forse) e creare un file intermedio con le liste di file e la data in un ordine ordinabile come il primo campo in ogni riga, quindi ordinare che file intermedio. Tuttavia, che si sente un po 'ingombrante e inefficienti (centinaia di comandi ls piuttosto che uno o due). Ma che può essere l'unico modo per farlo?
C'è un modo per passare "ls" un elenco di file da elaborare, in cui tali file potrebbero contenere spazi -. Sembra che dovrebbe essere semplice, ma io sono perplesso
Soluzione
Al posto di "uno o più caratteri vuoti", è possibile forzare bash per usare un altro separatore di campo:
OIFS=$IFS
IFS=$'\n'
ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS
Comunque, io non credo che questo codice sarebbe più efficiente di fare un ciclo; inoltre, che non funziona se il numero di file nella lista-dei-files.txt supera il numero massimo di argomenti.
Altri suggerimenti
Prova questo:
xargs -a list-of-files.txt ls -last | head -n 10
Non sono sicuro se questo funzionerà, ma hai provato spazi fuga con \
? Usando sed o qualcosa del genere. sed "s/ /\\\\ /g" list-of-files.txt
, per esempio.
Questo ha funzionato per me:
xargs -d\\n ls -last < list-of-files.txt | head -10