warum funktioniert das in einer Shell-For-Schleife, aber nicht allein

warum funktioniert das in einer Shell-For-Schleife, aber nicht allein

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*.txtTeil ausdehnt,mehrerePfade, bevor es an den aufgerufenen Befehl übergeben wird ( cpin 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*.txtTeil erweitert werden kann oder nicht, je nachdem, ob im outputVerzeichnis 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 cpbei 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.

verwandte Informationen