2014-05-16 15 views
9

Ich möchte alle Dateien aus einem Unterverzeichnis in ein anderes Verzeichnis kopieren, ohne den ursprünglichen Ordner zu kopieren. In einem Terminal würde ich dies nur tun:So kopieren Sie alle Dateien von einem Verzeichnis in ein anderes in einem Bash-Skript

cp -r dir1/* dir2 

und dann dir2 werden alle Dateien von dir1 ohne enthalten dir1 selbst enthalten. Ich versuche, dies in einem Bash-Skript zu replizieren, und ich bekomme einen Fehler. Hier ist meine bash Code:

cp -r $pck_dir"/*" $TAR_DIR"/pck/" 

ich diesen Fehler:

cp: cannot stat ‘./mailman/lists/mailman/*’: No such file or directory 

Das ist seltsam, weil ich überprüfen kann, dass das betreffende Verzeichnis existiert. Ich glaube, Bash beschwert sich über das '*', aber ich bin mir nicht sicher warum. Kann mich jemand aufklären, was ich falsch mache?

+4

'cp -r "$ pck_dir"/ * "$ TAR_DIR"/ Pck /' - Abstimmung als Tippfehler zu schließen. – devnull

+0

Irgendein Problem bei der Verwendung von '{}' um Variablen 'cp -r $ {pck_dir}/* $ {TAR_DIR}/pck /' – PradyJord

+2

Dies ist eine klar ausgesprochene Frage mit einer klar ausgesprochenen Antwort. Ich hatte das gleiche Problem und dank dieser Frage geht es mir nicht mehr. Die Erklärung, warum diese Frage geschlossen wurde, ergibt keinen Sinn. – andreasdr

Antwort

10

Erweiterung auf devnull Kommentar:

  • Zitate von jede Art um einen Platzhalter, wie *, wird die Schale aus dem Ausbau den Wildcard zu verhindern. Daher sollten Sie nur "/*" schreiben, wenn Sie einen Schrägstrich gefolgt von einem Literalstern möchten.

  • Eine nicht in Anführungszeichen gesetzte Variable unterliegt der Worttrennung. Wenn also pck_dir den Wert my dir hätte, würde $pck_dir"/*" zu den beiden Wörtern my und dir/* erweitert und beide Wörter würden als separate Argumente an cp übergeben werden. Sofern Sie keine Worttrennung wünschen, sollten Shell-Variablen immer in doppelte Anführungszeichen gesetzt werden.

So zu bekommen, was Sie wollen, verwenden Sie:

cp -r "$pck_dir"/* "$TAR_DIR/pck/" 
2

Verwenden Sie stattdessen die rsync-Befehlszeile.

rsync -auv dir1/dir2/

synchronisiert rekursiv alle Dateien aus dem Ordner dir1 in den Ordner dir2.

man rsync

mehr Erklärung kennen zu lernen, wie man diese comand Linie verwenden.

Verwandte Themen