come posso rinominare più file rimuovendo un carattere o una stringa?


21

Come seguito alla mia domanda precedente , se ho più file del modulo

sw.ras.001
sw.ras.002
sw.ras.003
…

Quale comando posso usare per rimuovere ras.il mezzo di tutti i file?


Vuoi rimuovere solo il ras, ovvero finire con sw..001, o il ras., lasciando sw.001?
Kevin

probabilmente vorrei rimuovere il "ras". il comando sarebbe molto diverso?
Paolo

No, solo se includi il \.negli schemi.
Kevin

Risposte:


35

Puoi farlo con una modifica abbastanza piccola di entrambe le risposte dall'ultima domanda:

rename s/ras\.// sw.ras.*

o

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Spiegazione:

renameè uno perlscript che accetta perlun'espressione regolare e un elenco di file, applica a sua volta la regex al nome di ciascun file e rinomina ogni file al risultato dell'applicazione della regex. Nel nostro caso, rasviene abbinato letteralmente e \.corrisponde a un letterale .(poiché .da solo indica qualsiasi carattere diverso da una nuova riga), e lo sostituisce con nulla.

Il forciclo prende tutti i file che iniziano con sw.ras.(standard shell glob) e li scorre sopra. ${var/search/replace}ricerca $varper searche sostituisce la prima occorrenza con replace, quindi ${file/ras./}ritorna $fileal primo ras.rimossi. Il comando quindi rinomina il file con lo stesso nome meno ras.. Si noti che con questa ricerca e sostituzione, .viene preso alla lettera, non come un carattere speciale.


Potresti spiegare la tua risposta agli altri da cui imparano? Cosa fanno "s / ras \ .// sw.ras. *"? Immagino di saperlo ma voglio esserne sicuro, e anche altri possono imparare. Seconda opzione allo stesso modo.
H_7

1
@ H_7 Buona idea, ho aggiunto una spiegazione.
Kevin

14

Un'altra opzione è utilizzare mmv (Mass MoVe e rinominare):

mmv '*ras.*' '#1#2'

Non dimenticare di usare le virgolette singole attorno ai tuoi schemi, altrimenti le stelle verranno espanse a livello di shell.

L'utilità non è sempre disponibile ma, in caso contrario, è possibile installarla con:

sudo apt-get install mmv

Vedi la pagina man qui .


1
Questo è un ottimo strumento !!!
Christian,

5

In ogni shell POSIX ( bash, dash, ksh, ecc):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

O con rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

Recentemente ho dovuto fare una rinominazione in blocco di un numero di file in cui ho dovuto sostituire l'ultima occorrenza di un personaggio in cui il personaggio si è verificato più volte nei nomi dei file. In questo caso particolare ho dovuto sostituire l'ultimo trattino- con un trattino basso _, trasformando questo:

some-long-file-name.ext

in questo:

some-long-file_name.ext

Ci è voluto del tempo, ma alla fine lo ha fatto:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Qui:

  • ${i%-*} corrisponde all'inizio del nome file fino all'ultima occorrenza del trattino -
  • ${file##*-} corrisponde al resto del nome file dopo l'ultima occorrenza del trattino -
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.