Ich habe ein Verzeichnis mit Unterverzeichnissen, das ich in ein anderes Verzeichnis kopieren möchte. Mein aktueller naiver Ansatz sieht folgendermaßen aus:
find src_dir -type d -exec mkdir -p dest_dir/{} \;
Es funktioniert, führt aber viele redundante mkdir
Anrufe aus, auch nacheinander.
Habe diese auch als Referenz ausprobiert:
# real fast
find src_dir -type d >/dev/null
# also real fast
find src_dir -type d -exec true {} +
# slower, but not as slow as mkdir
find src_dir -type d -exec true {} \;
Gibt es eine bessere Möglichkeit mit weniger Redundanz und weniger Exec-Aufrufen?
Antwort1
Mit rsync und Filterung (-f) können Sie die Verzeichnisse filtern und alles andere herausfiltern, und zwar wie folgt:
rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
Antwort2
Sie können das ;
in +
für ändern find ... -exec
, um die Anzahl der Prozessaufrufe zu verringern. In dieser Situation müssen Sie ein kleines Shell-Element verwenden, um die Liste der Verzeichnisse aufzurollen, die übergeben werden:
find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +
Entfernen Sie die beiden Instanzen von , echo
wenn Sie sicher sind, dass es wie erwartet funktioniert. (Beachten Sie insbesondere, dass Sie am Ende erhalten dest_dir/src_dir/...
; wenn Sie das nicht möchten, verwenden Sie stattdessen diese Art von Konstruktion und denken Sie daran, sicherzustellen, dass dest_dir
als absoluter Pfad neu geschrieben wird):
cd src_dir && find -type d ...