Einfache Befehlszeilenschleife in der Linux-Shell

Einfache Befehlszeilenschleife in der Linux-Shell

Ich habe identisch benannte Dateien in 4 Unterordnern des Ordners buildmit dem Namen:

  • iPhone-OS-Veröffentlichung
  • Veröffentlichung-iPhone-Simulator
  • debuggen-iphoneos
  • Debuggen des iPhone-Simulators

Ich möchte diese Dateien über die Befehlszeile in eine identische Verzeichnisstruktur in einem Ordner kopieren sdk, jedoch nicht mithilfe eines Skripts.

Ich dachte, ich sollte in der Lage sein, etwas zu tun wie:

for C in (release debug); for T in (iphoneos iphonesimulator); cp build/$C-$T/*.a sdk/$C-$T

Aber ich bin kein Linux-Fan und bekomme es nicht zum Laufen, selbst nachdem ich nach Schleifen gesucht habe. Kann man das relativ einfach in einer einzigen Zeile erledigen?

Antwort1

Ihr Ansatz bringt einige Probleme mit sich:

  • (A B)kann nur für die Array-Zuweisung (z. B.) verwendet werden C=(A B), nicht für die spontane Erstellung eines Arrays.

    Jedoch,fürerfordert kein Array, for C in A Bfunktioniert also einwandfrei.

  • Die richtige Syntax für forSchleifen ist for ... in ...; do ..., done.

Dieser Befehl sollte einwandfrei funktionieren:

for C in release debug; do for T in iphoneos iphonesimulator; do cp build/$C-$T/*.a sdk/$C-$T; done; done

Beachten Sie, dass hierfür die entsprechenden Ordner erforderlich sind inSDKbereits zu existieren.

Wie @Robertof jedoch bereits gezeigt hat, gibt es Möglichkeiten, dies ohne jegliche Schleifen zu archivieren.


Wenn Sie kopieren möchtenalleDateien aus den Verzeichnissen (d. h., sie *.apassen zu allen), können Sie seinen Befehl oder diese leichte Vereinfachung verwenden:

cp -R build/{release,debug}-iphone{os,simulator} sdk

Wie es funktioniert:

  • Die Shell wirdKlammererweiterung, daher wird folgender Befehl tatsächlich ausgeführt:

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • Der -rSchalter machtcprekursiv, d. h. es werden ganze Verzeichnisse statt nur Dateien kopiert.


Wenn Sie nur die ` kopieren möchten.ADateien (es gibt also noch andere), verwenden Sie besser diese Befehle:

cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk

Wie es funktioniert:

  • Auch hier wird die Klammererweiterung wie zuvor durchgeführt.

  • Der --parentsSchalter machtcpVerwenden Sie den vollständigen Quelldateinamen für das Ziel, d. h. Dateien von release-iphoneoswerden nach kopiert ../sdk/release-iphoneos.


Zum Schluss noch ein Ratschlag:

Beim Experimentieren mitcpBefehle, verwenden Sie immer den -iSchalter. Es machtcpinteraktiv, was bedeutet, dass vor dem Überschreiben eine Abfrage erfolgt.

Antwort2

Versuchen:

cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/

verwandte Informationen