• Ein Job für Automator?

    Moin.

    Ich habe ein Verzeichnis, in dem befinden sich insgesamt 5.000 Unterverzeichnisse. Darunter sind gefühlt tausend Verzeichnisse, zu denen es ein Double gibt, die einfach nur am Ende des Verzeichnisnamens noch ein »-1« haben. Ich brauche jetzt ein Skript, das die Inhalte aller <Verzeichnisname-1>-Verzeichnisse mit den <Verzeichnisname>-Verzeichnissen synchronisiert und anschließend alle <Verzeichnisname-1>- Verzeichnisse löscht.

    Wie bekomme ich das hin?

    Synchronize! Pro X ist – notfalls – an Bord.
    ----------
    #ehrenamt #macht #freizeit #sinnvoll
    • Hi Vatolin.

      Bring es zunächst mal in Form eines Ablaufdiagramms aufs Papier (UML). Wenn Du es auf diese Weise failsafe modelliert hast, setze es in einer tauglichen Programmiersprache Deiner Wahl um. Das ist eine Aufgabe, die auch mit Java gut machbar ist. Im Grunde hast Du drei Iterationen. Die erste sammelt alle Verzeichnisse ein. Die zweite Iteration prüft für jedes in Iteration Eins gesammelte Verzeichnis, ob es "Verzeichnis"-1 gibt (Java: File.exists). Ist dem der Fall, verzweigt das Programm in eine Unterverzeichnisüberprüfung (Rekursion). Handelt es sich um einen Match, wird das zu löschende Verzeichnis einer anderen Kollektion hinzugefügt (absolute Ordnerpfad). In Iteration Drei wird über diese Löschkollektion iteriert und rekursiv von der Platte gelöscht oder die Ordner in einen Löschordner (Java: einfach Pfad umbennnen) verschoben.

      Geh den Text evtl. mal durch und guck, ob Du ein Diagramm ableiten willst. Danach schnappe Dir eine Programmiersprache und interessiere Dich für Dateioperationen (File), Iteration, Collection (Lists, Sets, Maps), Rekursion.
      • Ach so

        bei der "Überprüfung" auf Übereinstimmung ist natürlich nicht nur nach gleichen Dateinamen zu checken, sondern auch nach deren Änderungsdatum und Größe. Falls Du ganz sicher gehen willst, auch die richtigen Dinge verglichen zu haben. Du sprachst auch Synchronisation an. In einem solchen Falle wäre dann ja auch zu entscheiden, ob es sich um ein abweichendes Verzeichnis handelt (Inhalte) oder ob Du die neueste Version an Stelle der veralteten im Verzeichnis ohne den Zusatz "-1" setzen willst. Und definiere den Begriff Verzeichnisdoublette sauber. Denn Du schriebst von <name> <name-1>. Die Frage die aufgeworfen werden muss ist, ob es in Deinen gefühlt 50TSD Verzeichnissen nicht auch wiederkehrende Strukturen gibt Bsp: Ordner1:Bilder||Audio||Video .......OrdnerX/Y/Z/Ordner2:Bilder-1||Audio-1||Video-1. Denn in solch einem Fall könnte man nie sicher sagen, dass es sich vom Namen her um eine exakte Kopie unter Ordner1 handelt. Und wie ist in einem solchen evtl. teilweise übereinstimmenden Fall (wiederverwendete, redundante Resourcen) mit dem Sync-Prozess zu verfahren? usw. usw. usw.....

        Du siehst, Problem und Lösung müssen im Vorfeld definiert werden. Dafür sind Entwicklungsdiagramme (UML Standards) hilfreich.
    • Einzeiler in Bash.

      Show Plain Text
      1. find . -type d -maxdepth 1 -name \*-1 -execdir sh -c 'i=$(basename "{}" -1) && rsync -av "{}/" "$i"' \; -execdir rm -r "{}" \;


      Ich würde es allerdings in zwei Schritte aufteilen, erst zusammenlegen, eventuell überprüfen, dann löschen:

      Show Plain Text
      1. find . -type d -maxdepth 1 -name \*-1 -execdir sh -c 'i=$(basename "{}" -1) && rsync -av "{}/" "$i"' \;
      2. find . -type d -maxdepth 1 -name \*-1 -execdir rm -r "{}" \;


      Vorher ein cd ins entsprechende Verzeichnis, oder find . durch find pfad/zum/verzeichnis ersetzen. Die rsync-Parameter nach Bedarf anpassen.