Rinomina in blocco, cambia prefisso


53

Come posso sostituire in blocco il prefisso per molti file?

Ho molti file come

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

Vorrei cambiarli tutti

  • CLConnectionContext.h
  • CLConnectionContext.m

Come lo farei?

Risposte:


38
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 CLal 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 -cavrei dovuto essere usato invece per gestire codifiche di caratteri che potevano avere più byte per carattere, come UTF-8.


Grazie, ho capito subito anche da solo. Contrassegnare come risposta. Thx
ErikTJ

Funziona bene, grazie. Puoi spiegare cosa fa il -b7-? Questo riferimento è alla lista di byte? ss64.com/bash/cut.html
imjared

@imjared Aggiornata la risposta con maggiori dettagli.
MR

56

Direi il più semplice usare solo il renamecomando 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


7
Un avvertimento: renameesistono più versioni allo stato brado. Controlla la renamedocumentazione locale per capire come utilizzare la tua.
jw013,

Per rimuovere l'alias dorename TestSR '' *
Bsienn,

hmm ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder, il

33

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

Spiegazione: TestSR*trova i file, CL${f#TestSR}sarà il nuovo nome. Il materiale dopo il #sarà sostituito dal nome file ( f).
Joe Eifert,

4

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 .m
  • n=CL -> Aggiungi un prefisso CL al nome del file
  • sed -e 's/^Test//' -> Rimuove il prefisso Test dal nome del file
  • mv $a $n -> Esegue la ridenominazione

3

Puoi provare con:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

Vedere man bash(sezione "Espansione dei parametri") per i dettagli.


1

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;

1
Nel caso in cui aiuti per il futuro, non devi ripetere i comandi per i tuoi due schemi; è possibile utilizzare (per esempio): for f in TestSR*.[mh], for f in TestSR*.{m,h}, for f in TestSR*.m TestSR*.h.
sig.

1

Se hai bisogno di qualcosa di più perlesco, puoi farlo

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
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.