Come rinominare più file sostituendo la parola nel nome del file?

Sostituire ACDC in AC-DC

Ad esempio abbiamo questi file

  • Dovrei dividere un'applicazione in più contenitori Docker collegati o combinati in uno?
  • In quali circostanze un punto di giunzione sarebbe più appropriato di un collegamento simbolico?
  • Negare tutti i file in una determinata directory usando <files>
  • File system distribuito veloce per grandi quantità di dati con metadati nel database
  • Come distribuire file e cartelle per gestire un gran numero di file
  • Come lasciare che non amministratori gestiscano l'iscrizione di gruppi di dominio selezionati?
  • ACDC – Rock N 'Roll non è rumore inquinamento.xxx

    ACDC – Rocker.xxx

    ACDC – Spara a Thrill.xxx

    Voglio che loro diventino:

    AC-DC – Rock N 'Roll non è rumore inquinamento.xxx

    AC-DC – Rocker.xxx

    AC-DC – Spara a Thrill.xxx

    So che sed o awk sono usati per questa operazione. Non posso andare a nulla, quindi ti chiedo il tuo aiuto =) Potreste forse fornire il command completo di shell per questo task?

    Risposta: Soluzione per gli utenti OSX

  • Ordine Unix per i set di dati parzialmente ordinati
  • Come si attende un exe per completare il file batch?
  • Come fare scp copiare i file nascosti?
  • Rimuovere un file con <Giù> nel nome?
  • Strani file di byte in radice
  • Imansible rimuovere file usando 'rm'
  • 6 Solutions collect form web for “Come rinominare più file sostituendo la parola nel nome del file?”

     rename 's/ACDC/AC-DC/' *.xxx 

    man rename

     DESCRIPTION "rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line, filenames will be read via standard input. 

    Ad esempio, per rinominare tutti i file corrispondenti a "* .bak" per eliminare l'estensione, si potrebbe dire

     rename 's/\.bak$//' *.bak 

    Per tradurre i nomi maiuscoli in basso, utilizzeresti

     rename 'y/AZ/az/' * 

    Questa risposta contiene le buone parti di tutte le altre risposte, lasciando fuori tale eresia come ls | while read ls | while read .

    Directory corrente:

     for file in ACDC*.xxx; do mv "$file" "${file//ACDC/AC-DC}" done 

    Incluse le sottodirectory:

     find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do mv "$file" "${file//ACDC/AC-DC}" done 

    I caratteri di Newline sono verosimilmente improbabili nei nomi dei file, per cui questo può essere più semplice mentre si lavora ancora con i nomi contenenti spazi:

     find . -type f -name "ACDC*" | while read -r file; do mv "$file" "${file//ACDC/AC-DC}" done 

    Per utilizzare la versione util-linux di rename che Phil ha riferito (su Ubuntu, si chiama rename.ul ):

     rename ACDC AC-DC ACDC* 

    o

     rename.ul ACDC AC-DC ACDC* 

    Utilizzo della shell bash

     find . -type f -name "ACDC*" -print0 | while read -d $'\0' f do new=`echo "$f" | sed -e "s/ACDC/AC-DC/"` mv "$f" "$new" done 

    Nota: utilizzando la find verrà elaborata la directory corrente e le directory sotto.

    Dipende dalla tua copertina. In zsh, farei questo:

     for file in ACDC*.xxx; do mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')" done 

    Probabilmente non la soluzione migliore, ma funziona.

    Utilizzo di bash:

     ls *.xxx | while read fn; do mv "${fn}" "${fn/ACDC/AC-DC}"; done 

    Se è installato il programma di rename :

     rename 's/ACDC/AC-DC/' *.xxx 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.