Ich habe eine Ordnerstruktur mit einer Reihe von * .csv-Dateien, die über die Ordner verteilt sind. Jetzt möchte ich alle * .csv-Dateien an einen anderen Speicherort kopieren und dabei die Ordnerstruktur beibehalten.
Es funktioniert folgendermaßen:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
und so weiter, aber ich möchte es mit einem Befehl tun.
'{}'
funktioniert genauso gut-execdir
sicherer ist als-exec
: Durch einfaches Ersetzen der Ordner bleibt die Ordnerstruktur nicht wie vorgesehen erhalten.Sie könnten auch dafür verwenden
rsync
.Wenn Sie leere Verzeichnisse aus dem Quellbaum behalten möchten, überspringen Sie die
--prune-empty-dirs
Option:Wenn Sie nicht möchten, dass Symlinks, Änderungsdaten, Dateiberechtigungen, Eigentümer usw. erhalten bleiben, ersetzen Sie diese bitte durch eine
-a
andere Kombination von-rlptgoD
. ;-)quelle
-m
ist eine Abkürzung für--prune-emty-dirs
.-R
Option hinzugefügt werden, um die übergeordnete Verzeichnisstruktur der Quelle zu kopieren. (Siehe meine Antwort hier.)Sie können find und cpio im Pass-Through-Modus verwenden
Dies findet alle .csv-Dateien im aktuellen Verzeichnis und darunter und kopiert sie nach / target, wobei die Verzeichnisstruktur beibehalten wird, in der sie verwurzelt sind
.
.Wenn du benutzt
Es findet alle Dateien in
/path/to/files
und unter und kopiert sie nach/target/path/to/files
und unter.quelle
Der
cp
Befehl lässt mehrere Quellargumente zu:CAVEAT: Ich verwende hier einen rekursiven Glob. Dies ist die
globstar
Option in Bash 4+ undksh
und wird standardmäßig in unterstütztzsh
. Rekursive Globs stimmen nicht mit versteckten Dateien und Ordnern überein. Einige Implementierungen folgen Symlinks, andere nicht .Wenn Ihre Shell keine rekursiven Globs unterstützt oder Sie diese nicht verwenden möchten, können Sie Folgendes tun:
*.csv */*.csv */*/*.csv */*/*/*.csv
- Dies ist natürlich sehr redundant und erfordert das Wissen, wie tief Ihre Verzeichnisstruktur ist.$(find . -name '*.csv')
- Damit werden versteckte Dateien und Ordner abgeglichen.find
unterstützt auch die Angabe, ob Symlinks befolgt werden oder nicht, was nützlich sein kann.quelle
shopt -s globstar
unmittelbar vor meinem Befehl korrigiert, und alles ist in Ordnung. Vielen Dank für das Follow-up!--parents
war das, wonach ich gesucht habe. DankeDieser hat für mich gearbeitet:
find -name "*.csv" | xargs cp --parents -t /target
quelle
find [things] | xargs [do stuff]
ist es sehr kraftvoll.find -print0
und behandelt werdenxargs -0
.Angenommen, Sie möchten diese Struktur replizieren von
./source
nach./destination
:Ich bin bereit, das als eine einzige Zeile zu zählen, als eine
cd source
eingebaute Shell.quelle
tar
hat die-C
Möglichkeit, nicht erst das Verzeichnis wechseln zu müssen.Aus
rsync
der Manpage von:Das würde also auch funktionieren:
quelle