Ich möchte eine Teilmenge von Dateien von dirA nach dirB verschieben (sagen wir Dateien mit "blah" im Dateinamen), aber ich möchte, dass alle verschachtelten Verzeichnisse am neuen Speicherort gleich sind. Wie kann ich das machen?
Ich möchte eine Teilmenge von Dateien von dirA nach dirB verschieben (sagen wir Dateien mit "blah" im Dateinamen), aber ich möchte, dass alle verschachtelten Verzeichnisse am neuen Speicherort gleich sind. Wie kann ich das machen?
Antworten:
Die Magie der rsync
Filterregeln:
$ rsync -av --filter="+ */" --filter="-! *blah*" /source /dest
Auf der rsync
Manpage finden Sie Details zu Filterregeln. Hier ist jedoch die komprimierte Version für diesen speziellen Bedarf.
--filter="+ */"
bedeutet "alles einschließen, was ein Verzeichnis ist"
--filter="-! *blah*
bedeutet "alles ausschließen, was blah NICHT im Dateinamen enthält"
Wenn Sie diese Dateien kopieren müssen, reicht cp aus:
cd dirA
find . -iname "*blah*" | xargs -If cp --parents f dirB
Option --parents
behält Unterverzeichnisse bei - es wird der vollständige Verzeichnispfad für das Ziel erstellt.
Das hat bei mir funktioniert:
rsync -ave 'ssh -p 22' --filter="+ */" --exclude="*_blah.blah" uid@555.55.555.55:/source/directory/ /destination/directory/
Der -e
Switch definiert das rsync
Übertragungsprotokoll mit dem Port als -p 22
. Außerdem sind die abschließenden /
Schrägstriche wichtig, damit das Programm weiß, dass es sich um Verzeichnisse handelt.
Danke @pdo für die zusätzlichen Stunden an meinem Arbeitstag!