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?
\.
negli schemi.
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?
\.
negli schemi.
Risposte:
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 perl
script che accetta perl
un'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, ras
viene abbinato letteralmente e \.
corrisponde a un letterale .
(poiché .
da solo indica qualsiasi carattere diverso da una nuova riga), e lo sostituisce con nulla.
Il for
ciclo prende tutti i file che iniziano con sw.ras.
(standard shell glob) e li scorre sopra. ${var/search/replace}
ricerca $var
per search
e sostituisce la prima occorrenza con replace
, quindi ${file/ras./}
ritorna $file
al 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.
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 .
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:]]
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 -
ras
, ovvero finire consw..001
, o ilras.
, lasciandosw.001
?