Wie kopiere ich die Verzeichnishierarchie (unter Auslassung von Dateien) in ein anderes Verzeichnis?

Wie kopiere ich die Verzeichnishierarchie (unter Auslassung von Dateien) in ein anderes Verzeichnis?

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 mkdirAnrufe 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 , echowenn 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_dirals absoluter Pfad neu geschrieben wird):

cd src_dir && find -type d ...

verwandte Informationen