Appiattire la gerarchia di directory preservando i nomi di directory nel nuovo nome di directory


7

Fondamentalmente voglio passare da questo:

.
├── 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

a questo:

.
├── 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

Nessuna delle soluzioni esistenti che ho trovato inclusa ha rinominato la directory stessa. Sarebbe bello poterlo fare con zmv, ma non riesco a capire come.


2
Non è una soluzione completa, quindi non una risposta: easytagpuò permetterti di farlo, ma solo per i file audio - non credo che sposteranno le copertine, ecc.
camper

2
Potrebbe esserci più di un album per un artista specifico all'interno di una directory di artisti? La struttura è sempre profonda tre livelli?
Nohillside,

1
@nohillside Sì, può esserci più di un album per un artista. E sì, la struttura è sempre profonda tre livelli.
aksh1618,

Risposte:


9

zsh

Non testato:

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

La seconda riga rimuove tutte le directory vuote, anche quelle che prima non avevano un file. È possibile aggirare questo problema con un mvwrapper personalizzato che registra da quali directory sposta le cose.

Si noti che questo attraversa i collegamenti simbolici alle directory nella directory corrente.

Utilità di rinomina Linux

Non testato.

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

Si noti che questo attraversa i collegamenti simbolici alle directory nella directory corrente e nelle sue sottodirectory. La seconda riga rimuove tutte le directory vuote, anche quelle che prima non avevano un file.

Script per rinominare il Perl

Non testato.

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

Si noti che questo attraversa i collegamenti simbolici alle directory nella directory corrente e nelle sue sottodirectory. La seconda riga rimuove tutte le directory vuote, anche quelle che prima non avevano un file.

Ecco un approccio più complesso che rimuove solo le directory da cui ha rinominato qualcosa. Ancora una volta, non testato.

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

12

Qualcosa del genere forse?

#!/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

Questo passa attraverso tutte le directory di livello superiore nella directory corrente (i nomi delle bande). Per ciascuna di queste directory, passa attraverso le sue sottodirectory (i nomi degli album). Per ogni coppia di nome della band e del nome dell'album, viene creata una nuova directory e i file dalla sottodirectory vengono spostati in essa. Le sottodirectory degli album vengono rimosse quando sono state elaborate, così come le directory di livello superiore della band originale.

Le rmdirchiamate non riusciranno se una directory contiene nomi di file nascosti o se non è possibile creare una delle nuove directory.

Questo è un codice totalmente non testato. Eseguilo su una copia di backup dei tuoi file.


Voglio dire, sì, qualcosa del genere funzionerebbe, ma sto cercando una soluzione a una o due linee, per funzionare facilmente dal terminale. Alcuni trovano / sed / zmv magic :)
aksh1618

10
Inserisci ot in una sceneggiatura, e -boom- diventa un one-liner.
Hans-Martin Mosner,

4

Strategicamente, anziché spostare i file, hai preso in considerazione l'idea di lasciare la struttura attuale e creare collegamenti per la nuova struttura che desideri?

Tatticamente, uno schema che farà il lavoro va in questo modo:

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"' {}
  • findindividua tutte le directory esattamente a due livelli di profondità dalla directory di lavoro corrente, che dovrebbe essere la directory che contiene le bande: quindi due livelli di profondità sono i nomi degli album sotto i nomi delle band. 1
  • xargs consuma ogni percorso contenente un album e chiama lo script bash inline.
  • bash -c '...'prende il percorso dell'album come primo argomento, suddividendolo in due parti: la band ( $b) e l'album ( $a). Infine, lo script riassembla i nomi nel formato desiderato e collega il nome della nuova directory alla directory originale.

Si noti che, in questo esempio, i collegamenti verrebbero creati nella stessa directory da cui si inizia, che si trova anche dove si trovano i nomi delle bande.

Potresti - e dovresti - modificare la lnstrategia sopra per adattarla alle tue intenzioni. mvcon i percorsi giusti se si desidera riorganizzare fisicamente o lnse si desidera creare una "vista" pratica sul supporto. Le parti importanti all'interno dello script bash sono:

  • $bil nome della band. Citare sempre: "$b".
  • $ail nome dell'album. Citare sempre: "$a".
  • $1il percorso fisico alla directory dell'album. Citare sempre: "$1".

1 Credo che m{ax,in}depthsiano supportati da GNU e da alcuni BSD find, ma non da POSIX: nel qual caso, affidati a */*una ginnastica a guscio simile o simile.


1
Mi piace questa risposta ... potresti anche creare hardlink, quindi eliminare la vecchia struttura delle cartelle quando sei soddisfatto
Thomas Zwaagstra,

@ThomasZwaagstra Non è diverso dallo spostare i file
Darkhogg il

1
@Darkhogg Exactly! OP stava cercando un liner per spostare i file. L'uso di hardlink con questa soluzione quasi lo farebbe, tranne per il fatto che avresti una fase intermedia di "anteprima" prima di eliminare i file originali
Thomas Zwaagstra,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.