Verkleinerung der Verzeichnishierarchie unter Beibehaltung der Verzeichnisnamen im neuen Verzeichnisnamen


7

Ich möchte im Grunde davon ausgehen:

.
├── Alan Walker
│   ├── Different World
│   │   ├── 01 Intro.mp3
│   │   ├── 02 Lost Control.mp3
│   │   └── cover.jpg
│   └── Same World
│       ├── 01 Intro.mp3
│       └── 02 Found Control.mp3
├── Aurora
│   └── Infections Of A Different Kind Step 1
│       ├── 01 Queendom.lrc
│       ├── 02 Forgotten Love.lrc
│       └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses
    └── Use Your Illusion I
        ├── 01 Right Next Door To Hell.lrc
        ├── 01 Right Next Door To Hell.mp3
        ├── 02 Dust N' Bones.lrc
        └── 02 Dust N' Bones.mp3

dazu:

.
├── Alan Walker - Different World
│   ├── 01 Intro.mp3
│   ├── 02 Lost Control.mp3
│   └── cover.jpg
├── Alan Walker - Same World
│   ├── 01 Intro.mp3
│   └── 02 Found Control.mp3
├── Aurora - Infections Of A Different Kind Step 1
│   ├── 01 Queendom.lrc
│   ├── 02 Forgotten Love.lrc
│   └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses - Use Your Illusion I
    ├── 01 Right Next Door To Hell.lrc
    ├── 01 Right Next Door To Hell.mp3
    ├── 02 Dust N' Bones.lrc
    └── 02 Dust N' Bones.mp3

Keine der vorhandenen Lösungen, die ich finden konnte, beinhaltete das Umbenennen des Verzeichnisses selbst. Es wäre großartig, dies mit zmv tun zu können, aber ich kann nicht herausfinden, wie.


2
Keine vollständige Lösung, also keine Antwort: easytagSie können dies tun, aber nur für Audiodateien - ich glaube nicht, dass es Cover usw. verschieben wird
rvs

2
Könnte es mehr als ein Album für einen bestimmten Künstler in einem Künstlerverzeichnis geben? Ist die Struktur immer drei Ebenen tief?
Nohillside

1
@nohillside Ja, es kann mehr als ein Album für einen Künstler geben. Und ja, die Struktur ist immer drei Ebenen tief.
Aksh1618

Antworten:


9

Zsh

Ungetestet:

zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

In der zweiten Zeile werden alle leeren Verzeichnisse entfernt, auch diejenigen, die zuvor keine Datei hatten. Es ist möglich, dies mit einem benutzerdefinierten mvWrapper zu umgehen, der aufzeichnet, aus welchen Verzeichnissen Dinge verschoben werden.

Beachten Sie, dass hierdurch symbolische Links zu Verzeichnissen im aktuellen Verzeichnis durchlaufen werden.

Linux-Dienstprogramm zum Umbenennen

Ungetestet.

rename / ' - ' */*/
rmdir -- */ 2>/dev/null

Beachten Sie, dass dies symbolische Links zu Verzeichnissen im aktuellen Verzeichnis und in seinen Unterverzeichnissen durchläuft. In der zweiten Zeile werden alle leeren Verzeichnisse entfernt, auch diejenigen, die zuvor keine Datei hatten.

Perl benennt das Skript um

Ungetestet.

prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

Beachten Sie, dass dies symbolische Links zu Verzeichnissen im aktuellen Verzeichnis und in seinen Unterverzeichnissen durchläuft. In der zweiten Zeile werden alle leeren Verzeichnisse entfernt, auch diejenigen, die zuvor keine Datei hatten.

Hier ist ein komplexerer Ansatz, bei dem nur Verzeichnisse entfernt werden, aus denen etwas umbenannt wurde. Wieder ungetestet.

prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/

12

So etwas vielleicht?

#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

Dies durchläuft alle Verzeichnisse der obersten Ebene im aktuellen Verzeichnis (die Bandnamen). Für jedes dieser Verzeichnisse werden die Unterverzeichnisse (die Albumnamen) durchsucht. Für jedes Paar aus Bandname und Albumname wird ein neues Verzeichnis erstellt und die Dateien aus dem Unterverzeichnis werden in dieses Verzeichnis verschoben. Die Album-Unterverzeichnisse werden entfernt, wenn sie verarbeitet wurden, ebenso wie die ursprünglichen Band-Top-Level-Verzeichnisse.

Das rmdir Aufrufe schlagen fehl, wenn ein Verzeichnis versteckte Dateinamen enthält oder wenn eines der neuen Verzeichnisse nicht erstellt werden konnte.

Dies ist völlig ungetesteter Code. Führen Sie es auf einer gesicherten Kopie Ihrer Dateien aus.


Ich meine, ja, so etwas würde funktionieren, aber ich suche nach einer ein- oder zweizeiligen Lösung, die problemlos vom Terminal aus ausgeführt werden kann. Einige finden / sed / zmv Magie :)
aksh1618

10
Fügen Sie ot in ein Skript ein, und -boom- wird zu einem Einzeiler.
Hans-Martin Mosner

4

Haben Sie strategisch überlegt, die aktuelle Struktur beizubehalten und Links für die gewünschte neue Struktur zu erstellen, anstatt Dateien zu verschieben?

Taktisch sieht ein Muster, das die Arbeit erledigt, so aus:

find . -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0n1 bash -c \
  'b=$(basename "$(dirname "$1")"); a=$(basename "$1"); echo ln -s "$1" "$b-$a"' {}
  • findFindet alle Verzeichnisse genau zwei Ebenen tief vom aktuellen Arbeitsverzeichnis entfernt, das das Verzeichnis sein sollte, das die Bänder enthält. Daher sind die Albumnamen unter den Bandnamen zwei Ebenen tief. 1
  • xargs verbraucht jeden Pfad, der ein Album enthält, und ruft das Inline-Bash-Skript auf.
  • bash -c '...'nimmt den Albumpfad als erstes Argument und teilt diesen Pfad in zwei Teile: die Band ( $b) und das Album ( $a). Schließlich setzt das Skript die Namen wieder in das gewünschte Format und verknüpft den neuen Verzeichnisnamen mit dem ursprünglichen Verzeichnis.

Beachten Sie, dass in diesem Beispiel die Links in demselben Verzeichnis erstellt werden, von dem aus Sie starten. Dort befinden sich auch die Bandnamen.

Sie können und sollten die lnoben beschriebene Strategie an Ihre Absicht anpassen. mvmit den richtigen Pfaden, wenn Sie physisch neu anordnen möchten oder lnwenn Sie eine bequeme "Ansicht" über die Medien erstellen möchten. Die wichtigen Teile des Bash-Skripts sind:

  • $bder Bandname. Zitieren Sie es immer : "$b".
  • $ader Albumname. Zitieren Sie es immer : "$a".
  • $1der physische Pfad zum Albumverzeichnis. Zitieren Sie es immer : "$1".

1 Ich glaube, sie m{ax,in}depthwerden von GNU und einigen BSD unterstützt find, aber nicht von POSIX. In diesem Fall sollten Sie sich auf */*oder ähnliche Muschelturnen verlassen.


1
Ich mag diese Antwort ... Sie könnten auch Hardlinks
erstellen

@ ThomasZwaagstra Das ist nicht anders als das Verschieben der Dateien
Darkhogg

1
@ Darkhogg Genau! OP suchte nach einem 1-Liner, um die Dateien zu verschieben. Die Verwendung von Hardlinks mit dieser Lösung würde dies fast erreichen, außer dass Sie eine Zwischenphase der "Vorschau" haben würden, bevor Sie die Originaldateien löschen
Thomas Zwaagstra
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.