Trova e sostituisci la stringa in un elenco di nomi di file


2

Ho un paio di file in questo modo, (su Mac OS X):

product-103-footer.tpl
product-103-header.tpl
product-103.tpl

Voglio sostituire '103' in tutti i nomi di file con qualcos'altro che utilizza grep e sed, o qualcosa del genere.

Come lo faccio?

Ecco qualche pseudo riga di comando di ciò che voglio ottenere

find . /[103] | grep 103 | sed s/103/104/

Spero che abbia senso!

MODIFICARE:

Avvicinarsi:

find . -name 'product-103*' -print | sed 's/103/104/g'

Posso sostituire una stringa usando sed: echo 'product-103' | sed 's / 103/104 / g', ma è necessario eseguire il ciclo di ogni file e rinominarli singolarmente.
josef.van.niekerk,

Risposte:


9

È possibile utilizzare findl' execopzione per ricorrere in modo (ricorsivo) su tutti i file, quindi utilizzare semplici sostituzioni di stringhe:

find . -type f -name "product-103*" \
-exec sh -c 'echo mv "$0" "${0/103/104}"' '{}' \;

Rimuovi echoquando sei sicuro che questo fa quello che vuoi.

Fondamentalmente, ciò che execfa è sostituire il nome del file di ogni file trovato {}, che viene passato come argomento a sh -c. Questo argomento è disponibile come $0, quindi il nome del file. Usiamo questo $0argomento in una mvchiamata, in cui il secondo argomento è il nuovo nome del file. Qui 103 viene sostituito con 104. Si noti che sono necessarie virgolette doppie per gestire correttamente gli spazi bianchi nei nomi dei file.

Vedi Manipolazione delle stringhe nella Guida agli script di Bash.


Con zsh zmv(su OS X attraverso /bin/zsh):

autoload -U zmv
zmv -Wn '*103*' '*104*'

Rimuovi l' -nopzione quando questo fa quello che ti serve.


2

Perl è meglio per questo.

find . -name 'product-103*' | perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

Il seguente pezzo di codice

perl -nle '($new=$_) =~ s/103/104/;rename $_,$new'

verrà infine espanso a

while (<>) {
    chomp;
    ($new=$_) =~ s/103/104/;
    rename $_, $new;
}

L' <>operatore otterrà il nome di ogni file con un '\ n' alla fine e lo salverà in $ _, quindi chomptroncerà '\ n'. Quindi la variabile $newottiene il vecchio nome di file $_e sostituisce 103 a 104. Alla fine, renamebasta rinominare il file in questione con il suo nuovo nome. Per maggiori dettagli sull'opzione -n -l -e, consultare la parte perlrun di perldoc.


2
for f in product-103*; do mv "$f" "${f/103/104}"; done
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.