Rsync zum Kopieren bestimmter Unterordner und Dateien in ein neues Verzeichnis

Rsync zum Kopieren bestimmter Unterordner und Dateien in ein neues Verzeichnis

Ursprünglicher Pfad, RootFolderI:

RootFolderI/FolderA/Subfolder1/Subsub1/JPG1.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub1/JPG2.jpg -> want this jpg
RootFolderI/FolderA/Subfolder2/Subsub2/JPG3.jpg
. . .
RootFolderI/FolderB/Subfolder1/Subsub1/JPG4.jpg -> want this jpg
RootFolderI/FolderB/Subfolder2/Subsub1/JPG5.jpg -> want this jpg
RootFolderI/FolderB/Subfolder3/Subsub2/JPG6.jpg
...

Es gibt viele Ordner (OrdnerA/B/C/usw.), aber die Struktur der Ordner darin ist immer gleich (außer den Dateien, diese sind unterschiedlich).


Ich möchte kopieren nach RootFolderII:

  • nur alle Ordner A/B/usw.
  • alle Dateien in Subsub1

...Das Ergebnis ist dieser neue Pfad, RootFolderII:

RootFolderII/FolderA/ with JPG1.jpg, JPG2.jpg
RootFolderII/FolderB/ with JPG4.jpg,JPG5.jpg

Ich habe im Moment den folgenden Code (aber er funktioniert nicht):

rsync -r --include='Folder*/Subfolder1/Subsub1/***' --exclude="/*/*/" /RootFolderI/ /RootFolderII/

Wo

--exclude="/*/*/" : erstellt OrdnerA/B/... -> funktioniert

--include='Folder*/Subfolder1/Subsub1/***' : ich möchte alle Dateien kopieren (nicht die Struktur) ... -> es funktioniert nicht

???also, ich glaube, selbst wenn es funktionieren würde, würde es Dateien von OrdnerB nach OrdnerA kopieren, und das will ich nicht!

Antwort1

Probieren Sie es aus.

rsync -r --include='*.jpg' --exclude="*" /RootFolderI/Folder*/Subfolder1/Subsub1/. /RootFolderII/.

Antwort2

Was ich getan habe:

  • rsyncmit Einschlüssen und Ausschlüssen

  • Dateien nach oben verschieben (2 Ebenen nach oben)

    find /folder/ -type f -mindepth 3 -execdir mv -t ../../ -- {} +
    
  • Leere Ordner löschen

    find /folder/*/ -type d -empty -delete
    

Antwort3

Ich glaube nicht, dass ich es rsyncfür diese Aufgabe verwenden würde. (Es gibt keinen Delta-Algorithmus, daher ist der Nutzen bei der Verwendung gering.) Hier ist eine Version mit cp:

for rfipath in RootFolderI/*
do
    folder="${rfipath/*\/}"
    mkdir -p "RootFolderII/$folder"
    cp -p "$rfipath"/*/Subsub1/* "RootFolderII/$folder"
done

Ausgabe

RootFolderII/FolderA/JPG1.jpg
RootFolderII/FolderA/JPG2.jpg
RootFolderII/FolderB/JPG4.jpg
RootFolderII/FolderB/JPG5.jpg

Wenn Sie wirklich verwenden möchten rsync, ersetzen Sie die cpZeile durch diese. Sie erhalten dann die Änderungszeiten für die Verzeichnisse:

for folder in RootFolderI/*
do
    rsync -a "$folder"/*/Subsub1/ "RootFolderII/${folder/*\/}"
done

verwandte Informationen