Risposte:
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
Questo utilizza la sostituzione del comando bash per rimuovere i primi 6 caratteri dal nome del file di input tramite cut
, anteporre CL
al risultato e memorizzarlo in $newname
. Quindi rinomina il vecchio nome con il nuovo nome. Questo viene eseguito su ogni file.
cut -c7-
specifica che solo i caratteri dopo l'indice 7 devono essere restituiti dall'input. 7-
è un intervallo che inizia all'indice 7 senza fine; cioè fino alla fine della linea.
In precedenza, avevo usato cut -b7-
, ma -c
avrei dovuto essere usato invece per gestire codifiche di caratteri che potevano avere più byte per carattere, come UTF-8.
Direi il più semplice usare solo il rename
comando che è comune su molte distribuzioni Linux. Esistono due versioni comuni di questo comando, quindi controlla la sua pagina man per trovare quale hai:
## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *
## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *
Se vuoi usare la versione di util-linux-ng in un sistema Debian, è disponibile sotto il nome rename.ul
rename
esistono più versioni allo stato brado. Controlla la rename
documentazione locale per capire come utilizzare la tua.
rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
L'espansione dei parametri della shell è sufficiente per trasformazioni semplici come questa. La sostituzione dei comandi è meno efficiente a causa della necessità di generare processi extra (per la sostituzione dei comandi stessa e cut
/ sed
).
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
TestSR*
trova i file, CL${f#TestSR}
sarà il nuovo nome. Il materiale dopo il #
sarà sostituito dal nome file ( f
).
Ecco un modo:
ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
ls *.{h,m}
-> Trova tutti i file con estensione .h o .mn=CL
-> Aggiungi un prefisso CL al nome del filesed -e 's/^Test//'
-> Rimuove il prefisso Test dal nome del filemv $a $n
-> Esegue la ridenominazionePuoi provare con:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
Vedere man bash
(sezione "Espansione dei parametri") per i dettagli.
Beh, non è stato difficile come pensavo.
$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
for f in TestSR*.[mh]
, for f in TestSR*.{m,h}
, for f in TestSR*.m TestSR*.h
.
Se hai bisogno di qualcosa di più perlesco, puoi farlo
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *