65 votes

Renommer des fichiers par lots dans le terminal, sur la base de modèles.

J'ai besoin de renommer les éléments suivants :

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

sur

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Comment faire pour que cela se produise avec une simple ligne de commande du terminal ?

97voto

darthrum Points 131

La solution à l'exemple ci-dessus, en utilisant renommer :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Utilisation :

rename [options] [Perl regex search/replace expression] [files]

De man rename :

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

rename PEUT prendre des regex comme arguments.

Ce que nous regardons, c'est le contenu entre les guillemets simples. ' . Vous pouvez placer des expressions rationnelles séparées par / .

Formule : s/(1)/(2)/(1) = modèle de recherche, et (2) = remplacer le modèle.

Donc, se familiariser avec les regex et profitez d'un renommage de fichiers par lots basé sur des modèles !

9voto

th_in_gs Points 382

Cela peut être fait avec la petite magie de l'expansion des paramètres de bash !

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*; - Le premier modèle est utilisé pour parcourir tous les fichiers qui commencent par 'file_anynumber_'.
${f#file_[0-9]*_} - Le deuxième modèle file_[0-9]*_ est utilisé dans l'expansion des paramètres qui indique à bash de supprimer 'file_anynumber_' au début de la chaîne.

Pour plus d'informations sur Parameter expansion :

man bash

7voto

bcag2 Points 379

Si les fichiers sont dans plusieurs répertoires, utilisez renommer après une recherche comme :

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

le -n après le renommage est pour tester, enlevez-le pour continuer !-)

comme ça, vous associez trouver et renommer le pouvoir.

Personnellement, je l'ai utilisé pour renommer l'en-tête des sources .h en .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X