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.txt
aufgetreten ist. Kann mir jemand erklären, warum das passiert ist und wie ich meinen Befehl so korrigieren kann, dass temp
er 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/s
sich im find
Suchpfad von befindet, find
werden Dateien aufgelistet, während die erzeugten cp
s 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
.