web-dev-qa-db-fra.com

Renommez plusieurs fichiers, mais seulement une partie du nom de fichier dans Bash

Je sais comment je peux renommer des fichiers, etc., mais cela me pose problème.

J'ai seulement besoin de renommer test-this dans une boucle for.

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 
45
user3115029

Si vous avez tous ces fichiers dans un dossier et que vous êtes sur Linux, vous pouvez utiliser:

rename 's/test-this/REPLACESTRING/g' *

Le résultat sera:

REPLACESTRING.ext
REPLACESTRING.volume001+02.ext
REPLACESTRING.volume002+04.ext
...

rename peut prendre une commande comme premier argument. La commande ici se compose de quatre parties:

  1. s: flag pour remplacer une chaîne par une autre chaîne,
  2. test-this: la chaîne que vous souhaitez remplacer,
  3. REPLACESTRING: la chaîne par laquelle vous souhaitez remplacer la chaîne de recherche, et
  4. g: un drapeau indiquant que toutes les correspondances de la chaîne de recherche doivent être remplacées, c'est-à-dire si le nom du fichier est test-this-abc-test-this.ext _ le résultat sera REPLACESTRING-abc-REPLACESTRING.ext.

Faire référence à man sed pour une description détaillée des drapeaux.

101
Tim Zimmermann

Utilisez rename comme indiqué ci-dessous:

rename test-this foo test-this*

Cela remplacera test-this avec foo dans les noms de fichiers.

Si vous n'avez pas rename, utilisez une boucle for comme indiqué ci-dessous:

for i in test-this*
do
    mv "$i" "${i/test-this/foo}"
done
44
dogbane

Une fonction

Je suis sur OSX et mon bash ne vient pas avec rename en tant que fonction intégrée. Je crée une fonction dans mon .bash_profile qui prend le premier argument, qui est un motif dans le fichier qui ne doit correspondre qu’une seule fois, sans se soucier de ce qui vient après, et remplace par le texte de l’argument 2.

rename() {
    for i in $1*
    do
        mv "$i" "${i/$1/$2}"
    done
}

Fichiers d'entrée

test-this.ext
test-this.volume001+02.ext
test-this.volume002+04.ext 
test-this.volume003+08.ext 
test-this.volume004+16.ext 
test-this.volume005+32.ext 
test-this.volume006+64.ext 
test-this.volume007+78.ext 

Commander

rename test-this hello-there

Sortie

hello-there.ext
hello-there.volume001+02.ext
hello-there.volume002+04.ext 
hello-there.volume003+08.ext 
hello-there.volume004+16.ext 
hello-there.volume005+32.ext 
hello-there.volume006+64.ext 
hello-there.volume007+78.ext 
10
Joe Flack