Warum funktioniert das
for X in A* ; do cp $X/output.txt output/$X.txt ; done
aber nicht das
cp A*/output.txt output/A*.txt
Zum Kopieren der Datei output.txt aus mehreren Ordnern mit den Namen A1, A2, A3, A4 usw. in einen kombinierten Ordner mit dem Namen „output“, wobei jeder Textdatei der Name des Ordners zugewiesen wird, aus dem sie stammt.
Antwort1
Da die Schale das A*.txt
Teil ausdehnt,mehrerePfade, bevor es an den aufgerufenen Befehl übergeben wird ( cp
in diesem Fall).
Das bedeutet, dass im ersten Fall, wenn Sie Dateien mit den Namen A1.txt, A2.txt, A3.txt und A4.txt haben und die Verzeichnisse A1, A2, A3 und A4 jeweils output.txt enthalten, es sich zuetwas wie:
for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done
und im zweiten Fall wird es erweitert zu:
cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt
wobei der output/A*.txt
Teil erweitert werden kann oder nicht, je nachdem, ob im output
Verzeichnis etwas vorhanden ist, das dem Glob entspricht. Wenn dies der Fall ist, wird es noch schlimmer, wie:
cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt
Da cp
bei mehreren Quelldateien ein Ziel gewünscht wirdVerzeichnisam Ende weiß es nicht, wie es damit umgehen soll, gibt einfach auf und gibt stattdessen einen Fehler aus.
Antwort2
Der Grund dafür ist, dass, wenn es mehr als zwei Argumente für gibt cp
, das letztemussein Verzeichnis sein. Dascp Man-SeiteZustände:
Zusammenfassung
cp [OPTION]… [-T] QUELLE ZIEL
cp [OPTION]...QUELLE...VERZEICHNIS
cp [OPTION]… -t VERZEICHNISQUELLE…
Beschreibung
Kopieren Sie die QUELLE nach ZIEL oder mehrere QUELLEN nach VERZEICHNIS.
Der Befehl, den Sie geschrieben haben,
cp file1 file2 file3 file4
sollte bedeuten
cp file1 file3; cp file2 file4
aber aus dem oben genannten Grund ist das nicht der Fall. Die for-Schleife erzeugt stattdessen genau die beiden Anweisungen direkt darüber, und das ist, was Sie wirklich wollen.