Kopieren Sie bestimmte Dateien und behalten Sie die Unterordnerstruktur bei

Ich habe einen Ordner mit einer großen Menge an Dateien mit unterschiedlichen Suffixen in mehreren Unterordnern.

Mein Automator-Workflow funktioniert wie folgt:

  1. Fragen Sie nach Finder-Objekten
  2. Ordnerinhalte abrufen (Unterordneroption aktiviert)
  3. Finder-Elemente filtern (nach einem bestimmten Dateisuffix)
  4. Kopieren Sie Finder-Objekte

Das funktioniert wie ein Zauber. Alle Dateien werden jedoch in denselben Stammzielordner kopiert. Ich muss die Unterordnerstruktur beibehalten. Zum Beispiel:

sourceFolder
    subfolderA
        fileA.jpg
        fileB.xls
        fileC.xls
    subfolderB
        fileC.jpg
        fileD.xls
        fileE.xls

Erwartetes Ergebnis (Filter für Dateiendung .xls):

destinationFolder
    subfolderA
        fileB.xls
        fileC.xls
    subfolderB
        fileD.xls
        fileE.xls

Aktuelles Ergebnis:

destinationFolder
    fileB.xls
    fileC.xls
    fileD.xls
    fileE.xls

Aktualisieren

Ich bin Entwickler. Also wird auch eine Shell oder AppleScript akzeptiert. :)

Antworten (3)

rsync -avh --include='*/' --include='*.xls' --exclude='*' path/to/sourceFolder/ path/to/destinationFolder

Beachten Sie /am Ende des Quellpfads, es ist wichtig . Diese Lösung würde alle leeren Verzeichnisse hinzufügen, wenn Sie sie nicht möchten, sehen Sie sich die Option an --prune-empty-dirs.

Mit der geschweiften Erweiterung können Sie tatsächlich mehr Dateitypen auf einmal einschließen, anstatt sie zu haben

--include='*.xls' --include='*.pdf' --include='*.txt'

Sie können verwenden

--include='*.'{xls,pdf,txt}
Großartig. ty! Ich werde testen und darauf zurückkommen.
Sie können alle gewünschten Optionen hinzufügen, der wichtige Teil ist das Einschließen–Ausschließen: Schließen Sie alle Verzeichnisse (notwendig für die Rekursivität) und alle .xlsDateien ein und schließen Sie dann alles andere aus. Wenn Sie mehr Dinge möchten, --deletefügen Sie sie Ihrem Befehl hinzu.

Am Ende habe ich ein Shell-Skript, das wie gewünscht funktioniert:

$ find ./sourceFolder -name "*.xls*" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -avR "{}" "./destinationFolder/"
rsync -avh --include='*/' --include='*.xls' --exclude='*' sourceFolder/ destinationFolder? Mit der geschweiften Erweiterung können Sie tatsächlich mehr Dateitypen einbeziehen --include='*.'{xls,pdf,txt}.
@ Manuel Ty! Irgendwelche Vor-/Nachteile deiner Lösung?
Dass Sie nicht durch Pipes verketten, sondern nur rsynceinmal mit den entsprechenden Flags aufrufen.

In einem Shell-Skript können Sie mkbom verwenden, um eine BOM-Datei (Stückliste) zu erstellen, die eine Liste von Dateien enthält, die Sie kopieren möchten. Dann können Sie den Befehl ditto mit der Option --bom verwenden, um nur die Dateien zu kopieren, die in der BOM-Datei aufgeführt sind.

ty! Irgendwelche Vor-/Nachteile deiner Lösung?