Verwenden von find, exec und cp zum Kopieren bestimmter Dateien unter Beibehaltung des Verzeichnispfads

Verwenden von find, exec und cp zum Kopieren bestimmter Dateien unter Beibehaltung des Verzeichnispfads

Ich habe folgende Ordner mit leeren Textdateien eingerichtet:

1/a.txt
2/b.txt

Ich möchte nur txt-Dateien in ein anderes Verzeichnis kopieren und dabei ihre Verzeichnisstruktur beibehalten. Daher habe ich die folgenden Befehle ausprobiert:

mkdir -p temp/s;
find ./ -name '*txt' -exec cp --parents '{}' ./temp/s \;

Jetzt sehe ich die folgenden Dateien aus meinem aktuellen Verzeichnis:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt
temp/s/temp/s/2/b.txt

Ich verstehe nicht, warum die letzte Zeile temp/s/temp/s/2/b.txtaufgetreten ist. Kann mir jemand erklären, warum das passiert ist und wie ich meinen Befehl so korrigieren kann, dass temper nicht in einem anderen verschachtelt ist temp?

Dies ist das Endergebnis, das ich erwartet hatte:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt

Antwort1

Du hast einRennbedingung: Da temp/ssich im findSuchpfad von befindet, findwerden Dateien aufgelistet, während die erzeugten cps neue Dateien hinzufügen.

Sie müssen das Unterverzeichnis während der Ausführung ausschließen find:

find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;

Beachten Sie, dass \;durch das Ersetzen +durch wesentlich weniger Prozesse entstehen cp.

verwandte Informationen