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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top