2012-06-15 7 views
16

Vorrei solo cambiare questoBash: Rinominare piccola parte di più file in mezzo a nome

cc211_AMBER_13062012i.II cc211_GROMOS_13062012i.II 
cc211_CHARM_13062012i.II cc211_OPLS_13062012i.II 

a

cc211_AMBER_15062012i.II cc211_GROMOS_15062012i.II 
cc211_CHARM_15062012i.II cc211_OPLS_15062012i.II 

ho provato,

find -name "*.13 *" | xargs rename ".13" ".15" 

C'è normalmente non c'è spazio tra il 3 e il secondo asterisco, questo lo rende solo in corsivo da quello che posso vedere. Fondamentalmente ci sono molte risposte su cosa fare quando si trova alla fine del nome del file, dove sembra che Asterix funzioni, ma qui non riesco a farlo funzionare.

Tutto ciò che hai potrebbe rendere la mia vita molto più facile!

Edit 1: Prova

-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

-bash-4.1$ rename 's/_13/_15/' cc* 
-bash-4.1$ ls 

cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

Grazie,

Charlie

+0

Perché 'Rinomina ".13" " .15" 'invece di' rinominare "_13" "_15" '? – chepner

risposta

22

ne dite di questo:

for i in *.II; do mv $i $(echo $i | sed 's/_13/_15/g'); done 

Questo sostituirà _13 con _15 in tutti i file con estensione .II

Maggiori informazioni su sed here.

6
rename 's/_13/_15/' cc* 

dovrebbe fare quello che vuoi. L'espressione regolare s/_13/_15/ sostituisce _13 per _15 in tutti i file che iniziano con 'cc'.

$ ls 
cc211_AMBER_13062012.II cc211_GROMOS_13062012.II 
cc211_CHARM_13062012.II cc211_OPLS_13062012.II 

$ rename 's/_13/_15/' cc* 

$ ls 
cc211_AMBER_15062012.II cc211_GROMOS_15062012.II 
cc211_CHARM_15062012.II cc211_OPLS_15062012.II 

Questo funziona solo con la versione più recente del perl rename. Per verificare quale versione hai fatto, man rename. Se la parte superiore della pagina dice

Perl programmatori Guida di riferimento

si dispone della versione di Perl. Se si dice: Manuale

avete la versione standard (più vecchia)

Linux del programmatore.

Per la versione precedente, il comando dovrebbe essere:

rename _13 _15 cc* 
+0

Non sembra funzionare sulla mia shell, vedi Modifica 1? Che cosa ho fatto di sbagliato? – cc211

+1

Penso che abbiamo diverse versioni del comando 'rename'. Ho modificato la mia risposta con maggiori dettagli, spero che aiuti! –

+3

'rename' è uno strumento da riga di comando nel pacchetto perl, noto anche come' prename'. Può usare un'espressione perl infinitamente complessa, quindi 'prename -n 'usa LWP :: Simple; my $ http = get (" http: //airport-authority.com/browse-FR");while($http=~m/>([^<>]+) <\/a> \ ((\ w \ w \ w) \)/gc) {my $ da = $ 2; my $ a = $ 1; $ a = ~ s// _/g; s/$ da/$ a/g}; ' MRS_DOLLY_PARTON.MP3 PUFF_DADDY.MP3' rinominerà i tre codici lettera nei nomi dei file per i nomi delle porte aeree francesi con caratteri di sottolineatura, in questo caso i due MP3 vengono rinominati "Marseille_Airport_St_Gatien_AirportLY_PARTON.MP3' e" Uzein_AirportF_DADDY.MP3'. –

19

Una pura bash soluzione:

for i in cc*; do 
    mv "$i" "${i/_13/_15}" 
done 
+0

Questo è abbastanza pulito. –

+1

Suggerirei di aggiungere preventivi come questo quindi non ci sono problemi con gli spazi nei nomi dei file: per i in cc *; fai mv "$ i" "$ {i/_13/_15}"; done – syss

+0

@ user234461 No, le espansioni dei parametri utilizzano pattern glob, non espressioni regolari. – chepner

0

Sto utilizzando una soluzione di pura Linux:

### find all files that contains _DES in name and duplicate them adding _AUXLOCAL 
for f in **/*_DES*; do 
    cp "$f" "${f%.DES}_AUXLOCAL" 
done 
###Rename all _AUXLOCAL files, removing _DES to _LOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_DES/_LOCAL}" 
done 
###Rename all _AUXLOCAL files, removing _AUXLOCAL 
for f in **/*_AUXLOCAL*; do 
    mv "$f" "${f/_AUXLOCAL/}" 
done 

Spero che aiuta

Problemi correlati