Frage

Ich beginne mit einer Datei mit einer Liste von Hunderten von Dateien (vollständige Pfade) in einer zufälligen Reihenfolge. Ich möchte die Details der zehn neuesten Dateien in dieser Liste auflisten. Dies ist mein naiver Versuch:

$ ls -las -t `cat list-of-files.txt` | head -10

Das funktioniert, solange keines der Dateien Leerzeichen hat, aber fehlschlägt, wenn sie dies tun, wenn diese Dateien an den Leerzeichen aufgeteilt und als separate Dateien behandelt werden. Datei "Hallo Welt" gibt mir:

ls: hello: No such file or directory
ls: world: No such file or directory

Ich habe versucht, die Dateien in der ursprünglichen Dateiliste zu zitieren, aber das Here-Document teilt die Dateien immer noch auf den Feldern in den Dateinamen auf und behandelt die Zitate als Teil der Dateinamen:

$ 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

Ich kann mir nur vorstellen, dass ich jede Datei einzeln (vielleicht mit Xargs mit Xargs) ls zu . Das fühlt sich jedoch etwas umständlich und ineffizient an (Hunderte von LS -Befehlen anstelle von ein oder zwei). Aber das kann der einzige Weg sein, dies zu tun?

Gibt es eine Möglichkeit, "ls" eine Liste von Dateien zu verarbeiten, bei denen diese Dateien Leerzeichen enthalten könnten - es scheint einfach zu sein, aber ich bin stumpf.

War es hilfreich?

Lösung

Anstelle von "ein oder mehreren leeren Zeichen" können Sie Bash dazu zwingen, einen anderen Feldabscheider zu verwenden:

OIFS=$IFS
IFS=$'\n'

ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS

Ich denke jedoch nicht, dass dieser Code effizienter wäre als eine Schleife. Darüber hinaus funktioniert dies nicht, wenn die Anzahl der Dateien in list-of-Files.txt die maximale Anzahl von Argumenten überschreitet.

Andere Tipps

Versuche dies:

xargs -a list-of-files.txt ls -last | head -n 10

Ich bin mir nicht sicher, ob dies funktionieren wird, aber haben Sie versucht, Räume mit zu entkommen \? Verwenden von SED oder so. sed "s/ /\\\\ /g" list-of-files.txt, zum Beispiel.

Das hat für mich funktioniert:

xargs -d\\n ls -last < list-of-files.txt | head -10
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top