Verwenden des Mac OS X-Terminals zum Kopieren einer Auswahl von Ordnern an einen neuen Speicherort mit Zusammenführungsverhalten

Verwenden des Mac OS X-Terminals zum Kopieren einer Auswahl von Ordnern an einen neuen Speicherort mit Zusammenführungsverhalten

Ich habe einen Ordner 'foo', der viele Unterordner enthält, zB

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

Es gibt noch viel mehr als das, aber hoffentlich erklärt es das Szenario. Ich möchte nun alle Ordner aus diesem Ordner, die mit „2011“ beginnen, in einen Geschwisterordner von „foo“ namens „bar“ kopieren. „bar“ enthält jedoch bereits einige Ordner mit demselben Namen

bar
 |---20111
 |---20113
 |---20114

Der Inhalt des Quell- und Zielordners sollte zusammengeführt werden. Beachten Sie, dass das Skript auch einen Ordner bar/20112 erstellen muss, da dieser nicht existiert.

Ich bin neu im Mac Terminal-Scripting und habe es erfolgreich geschafft, die richtigen Ordner zu greppen

foo>ls | grep ^2011 

Dadurch werden die richtigen Ordner aufgelistet, aber ich habe keine Ahnung, wie ich das an einen entsprechenden Kopiervorgang weiterleiten kann.

Antwort1

Der Kopierbefehl lautet cp. Wenn Sie ihm das -rFlag (rekursiv) geben, wird er genau das tun, was Sie wollen: Er kopiert Dateien in vorhandene Ordner und erstellt neue Ordner, wenn der Zielordner fehlt.

Jedoch,Sie sollten niemals die Ausgabe vonlsverwenden Sie findoder, noch einfacher,Bash-Globbing:

cp -rv foo/2011* bar/

Wenn es Dateien und Ordner gibt, deren Namen mit beginnen 2011, verwenden Sie findund die -execOption, die den von Ihnen eingegebenen Befehl auf alles anwendet, was mit gefunden wird find(bezeichnet als {}):

find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;

In diesem speziellen Fall gibt es keinen Grund, die Ausgabe eines Befehls zu speichern und an weiterzugeben cp. Dies ist jedoch manchmal notwendig, deshalb wird es wie folgt gemacht. Im Allgemeinen kann die Ausgabe eines Befehls als Eingabe für einen anderen Befehl verwendet werden, wenn sie in Anführungszeichen oder gesetzt wird $().

cp -rv `find foo/ -type d -name "2011*"` bar/

oder

cp -rv $(find foo/ -type d -name "2011*") bar/

Alternativ können Sie die Ergebnisse in einer Schleife durchlaufen:

for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done

Dies wird komplizierter, wenn Ihre Datei-/Ordnernamen Sonderzeichen oder neue Zeilen usw. enthalten können. In diesem Fall sollten Sie etwa Folgendes tun:

find foo/ -type d -name "2011*" | while IFS= read -r dir; do 
       cp -rv "$dir" bar/; 
done

verwandte Informationen