Ich hatte hier früher eine peinlich runde Antwort, aber Denis 'Antwort erinnerte mich daran, dass ich das Grundlegendste verpasst hatte. Also habe ich meine ursprüngliche Antwort gelöscht. Aber da niemand diese sehr grundlegende Sache gesagt hat, denke ich, dass es sich lohnt, sie hier zu platzieren.
Die ursprüngliche Frage lautet: "Ich habe eine Textdatei mit einer Liste von durch Leerzeichen getrennten Dateinamen. Wie kann ich diese in ein Zielverzeichnis kopieren?" Auf den ersten Blick mag dies schwierig oder kompliziert erscheinen, da Sie denken, dass Sie die Elemente auf eine bestimmte Weise aus der Datei extrahieren müssen. Wenn die Shell jedoch eine Befehlszeile verarbeitet, teilt sie die Argumentliste zunächst in Token und (hier ist das Bit, das niemand direkt gesagt hat) Leerzeichen in Token auf . (Neue Zeilen trennen auch Token, weshalb Doug Harris 'Test mit einer durch neue Zeilen getrennten Liste dasselbe Ergebnis lieferte.) Das heißt, die Shell erwartet und kann bereits eine durch Leerzeichen getrennte Liste verarbeiten.
Alles, was Sie hier tun müssen, ist, die durch Leerzeichen getrennte Liste (die Sie bereits haben) an die richtige Stelle in Ihrem Befehl zu setzen. Ihr Befehl ist eine Variation davon:
cp file1 file2 file3...file# target
Der einzige Nachteil ist, dass Sie die Liste der Dateien 1 bis # aus Ihrer Textdatei abrufen möchten.
Wie Dennis in seinem Kommentar cp
betont , hätte Ihr ursprünglicher Versuch ( cat list.txt new_folder
) bereits funktionieren müssen. Warum? Denn der interne Befehl cat list.txt
wird zuerst von der Shell verarbeitet und erweitert. file1 file2 file3...file#
Genau das erwartet und wünscht sich die Shell in diesem Teil des Befehls. Wenn es nicht geklappt hat, waren entweder (1) Sie einen Tippfehler oder (2) Ihre Dateinamen irgendwie seltsam (sie hatten Leerzeichen oder andere ungewöhnliche Zeichen).
Der Grund, warum alle Antworten von Dennis funktionieren, besteht einfach darin, dass sie die erforderliche Liste von Dateien für cp
die Bearbeitung bereitstellen und diese Liste dort platzieren, wo sie in den gesamten Befehl gehört. Der Befehl selbst ist wiederum folgendermaßen aufgebaut:
cp list-of-files target_directory
Es ist leicht zu sehen, wie das alles in dieser Version zusammenkommt:
cp $(<list.txt) new_folder
$()
Bewirkt, dass die Shell den Befehl in Klammern ausführt und die Ausgabe an dieser Stelle in der größeren Zeile ersetzt. Dann führt die Shell die gesamte Linie aus. Übrigens $()
ist eine modernere Version dessen, was Sie bereits mit Backticks gemacht haben (`). Next: <
ist ein Dateiumleitungsoperator. Es weist die Shell an, den Inhalt der list.txt
Standardeingabe zu sichern. Da das $()
Bit zuerst verarbeitet wird, geschieht Folgendes schrittweise:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
Offensichtlich ist Schritt 2 einfach der normale cp
Befehl, den Sie wollten.
Mir ist klar, dass ich dieses (vielleicht sehr tote) Pferd sehr oft besiege, aber ich denke, dass es sich lohnt, es zu tun. Wenn Sie genau wissen , wie die Shell einen Befehl verarbeitet, können Sie ihn besser schreiben und erheblich vereinfachen. Es zeigt Ihnen auch, wo sich Probleme wahrscheinlich verstecken. In diesem Fall hätte meine erste Frage an Sie zum Beispiel nach lustigen Dateinamen oder einem möglichen Tippfehler lauten sollen. Akrobatik war nicht erforderlich.