Prima di tutto, devo dire che l' esempio bash
codice usato in questa risposta, mostrato più avanti, non è affatto robusto, tuttavia fa il lavoro!
Con quanto segue come esempio rappresentativo della struttura gerarchica delle directory :
.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│ ├── A Most Violent Year (2014) 1180 20150807Lov
│ ├── A Most Wanted Man (2014) 1146
│ ├── A Nightmare on Elm Street (2010) 0432
│ ├── A Perfect Getaway (2009) 0433
│ └── ¡NO! (2012) 0939
├── QRST
├── UVWX
└── YZ
Quindi, dopo aver eseguito l' esempio bash
codice salvato come bash
script e eseguito dalla directory contenente la struttura gerarchica mostrata sopra, i risultati per le directory saranno come mostrato di seguito, ed essendo come l'output desiderato dichiarato basato sul campione rappresentativo del struttura gerarchica delle directory sopra riportata:
.
├── ABCD
├── EFGH
├── IJKL
├── MNOP
│ ├── (0432) A Nightmare on Elm Street (2010)
│ ├── (0433) A Perfect Geatway (2009)
│ ├── (0939) ¡NO! (2012)
│ ├── (1146) A Most Wanted Man (2014)
│ └── (1180) A Most Violent Year (2014) 20150807Lov
├── QRST
├── UVWX
└── YZ
Per utilizzare l' esempio bash
codice , in Terminale cd
nella directory contenente il ABCD
, EFGH
, ecc. directory ed esegui i seguenti comandi :
touch rendir; nano rendir
In nano
copia e incolla il esempio bash
codice , mostra sotto, nel file rendir
e quindi premi Controllo + X e quindi Y e quindi Invio .
Avanti:
chmod u+x rendir
Ora che è eseguibile, eseguilo digitando:
./rendir
Quindi premi Invio per eseguirlo.
Esempio bash
codice :
#!/bin/bash
find -E . -type d -regex '.* [0-9]{4}$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$NF")"}'<<<"$d")"
f="$(awk '{$NF=""; sub(/ $/, "", $0); print $0}'<<<"$d")"
echo mv "$l" "$p/$n $f"
done</tmp/foo
find -E . -type d -regex '.* [0-9]{4} .*$' > /tmp/foo
while read -r l; do
p="$(dirname "$l")"
d="$(basename "$l")"
n="$(awk '{print "("$(NF - 1)")"}'<<<"$d")"
f="$(awk '{$(NF - 1)=""; print $0}'<<<"$d" | awk 'sub(/ /," ")')"
echo mv "$l" "$p/$n $f"
done</tmp/foo
rm /tmp/foo
Nota che come codificato, produrrà i comandi mv
che verrebbero eseguiti se echo
non fosse presente. Dopo aver testato ed esaminato l'output per vedere che i mv
comandi sono formati correttamente, puoi modificare rendir
( nano rendir
) e rimuovere le due occorrenze di echo
, salvando il file , ancora usando ( Controllo + X e poi Y e poi Invio ) ed eseguendolo di nuovo.
A questo punto dovresti avere l'output desiderato come mostrato nella seconda tree
struttura gerarchica delle directory sopra mostrata. Questo esempio bash
codice non tiene conto di alcuna deviazione da quanto espresso nell'OP e dai commenti all'OP.
NOTA: non devi mai eseguire code senza aver prima eseguito correttamente il backup e / o provare il codice su una copia di prova degli originali.
Se conoscessi awk
meglio immagino che un awk
programma possa essere scritto per manipolare la stringa di input nella stringa di output desiderata in una singola chiamata di awk
, ma non conosco abbastanza bene la awk
per raggiungerla.
Nota: l' esempio bash
codice è proprio questo e non impiega alcuna gestione degli errori e è pensato solo per mostrare uno dei molti modi per eseguire un compito. L'onere è sempre sull'utente di aggiungere / utilizzare la gestione degli errori appropriata come necessario / voluto.