script di terminale per rinominare le cartelle in uno schema specifico

1

Ho circa centinaia di file di film memorizzati in una cartella. lo schema che ho chiamato ogni cartella è come questo:

ABCD

per film con titoli che iniziano con A, B, C o D per esempio. In questa cartella ci sono quelle cartelle di film come questa

Blade Runner 2049 (2017) 0526 20180223Eph

0526 è un numero specifico per questo file / cartella.

Mi piacerebbe rinominare tutte le cartelle in questo schema:

(0526) Blade Runner 2049 (2017) 20180223Eph

ma non so come farlo sul mio mac ?! tieni presente che alcune cartelle non hanno il suffisso come 20180223Eph .

Dovrebbe essere fatto per tutti i film in un turno - rinominare tutto usando finder sarebbe un po 'troppo lungo ...

Grazie in anticipo,

mnasdaq

    
posta m nasdaq 28.02.2018 - 16:52
fonte

1 risposta

1

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.

    
risposta data 28.02.2018 - 23:28
fonte

Leggi altre domande sui tag