2011-01-03 12 views
1

Ich beginne mit einer Datei mit einer Liste von Hunderten von Dateien (vollständige Pfade) in zufälliger Reihenfolge. Ich möchte die Details der zehn letzten Dateien in dieser Liste auflisten. Das ist mein naiver Versuch:Bash: Auflistung von Dateien in Datumsreihenfolge, mit Leerzeichen in Dateinamen

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

Das heißt, solange keine der Dateien mit Leerzeichen, aber nicht, wenn sie es tun, da diese Dateien werden aufgeteilt in die Räume und behandelt als separate Dateien funktioniert. Die Datei „Hallo Welt“ gibt mir:

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

Ich habe versucht, zitiert die Dateien in der ursprünglichen Liste-of-Dateien Datei, aber das hier-Dokument teilt noch die Dateien an den Leerzeichen im Dateinamen auf, die Behandlung von 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 

die einzige Art, wie ich dies zu tun denken kann, ist jede Datei einzeln ls und erstellen Sie eine Zwischendatei mit den Dateilisten und das Datum in einer sortierbare (xargs vielleicht mit) Reihenfolge als das erste Feld in jeder Zeile, dann sortieren Sie diese Zwischendatei. Das fühlt sich jedoch etwas umständlich und ineffizient an (Hunderte von ls Befehlen statt einer oder zwei). Aber das könnte der einzige Weg sein, es zu tun?

Gibt es eine Möglichkeit, "ls" eine Liste von Dateien zu verarbeiten, wo diese Dateien Leerzeichen enthalten könnten - es scheint wie es sollte einfach sein, aber ich bin ratlos.

+0

Vielen Dank - ich habe ein paar Antworten hier, dass die Arbeit, und ich bin Marco Version. Ich bin mir sicher, dass die Xargs-Methode mit einigen Verbesserungen laufen könnte, und ich werde das längerfristig untersuchen. Alle helfen sehr geschätzt. – Jason

Antwort

6

Statt „ein oder mehr leere Zeichen“, Sie bash ein anderes Feldtrennzeichen verwenden zwingen können:

OIFS=$IFS 
IFS=$'\n' 

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

Allerdings glaube ich nicht, Dieser Code wäre effizienter als eine Schleife; Darüber hinaus funktioniert das nicht, wenn die Anzahl der Dateien in der Datei list-of-files.txt die maximale Anzahl der Argumente überschreitet.

+0

Meine Güte - das habe ich nie gewusst. Dies funktioniert ein Vergnügen :-) Keine Änderungen an meinem bestehenden Code überhaupt - ich habe nur IFS in dem Skript, das die Auflistung tut gesetzt. – Jason

+0

@Jason: Dann sollten Sie dies wahrscheinlich als die akzeptierte Antwort markieren. Ich gebe es selbst +1. –

+0

Ah - klick auf das Häkchen ;-) Habe mir schon angesehen wie man eine Antwort akzeptiert und konnte einfach nicht das Holz für die Bäume sehen. – Jason

1

Ich bin mir nicht sicher, ob das funktioniert, aber hast du versucht, Leerzeichen mit \ zu umgehen? Mit sed oder etwas. sed "s/ /\\\\ /g" list-of-files.txt, zum Beispiel.

+0

Die Räume scheinen immer noch angesaugt zu werden: ls: Hallo \: Keine solche Datei oder Verzeichnis \ nls: Welt: Keine solche Datei oder Verzeichnis – Jason

+0

Hmm. Nun, es war einen Versuch wert, denke ich. Marco's Lösung scheint der richtige Weg zu sein, ich werde es verbessern. :) – flamingspinach

1

Das ist für mich gearbeitet:

xargs -d\\n ls -last < list-of-files.txt | head -10 
+0

Also xargs läuft nicht ls mehrere Male - es läuft nur einmal, aber behandelt die Übergabe der Raum-enthaltenden Parameter besser als ein Here-Dokument. Ich habe nicht die Option "-d" auf meinen Xargs (GNU xargs Version 4.1.20), aber ich werde diesen Ansatz verfolgen. – Jason

2

Try this:

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

Ich habe keine "-a" -Option auf meiner Version von xargs. Ich habe versucht, die Quelldatei in xargs zu leiten, aber das gibt mir das gleiche Problem - Dateinamen, die auf Leerzeichen aufgeteilt sind. – Jason