Comment renommer plusieurs fichiers en supprimant des caractères dans bash?


10

Je dois renommer plusieurs fichiers dans le répertoire en supprimant les 5 premiers caractères de chaque nom de fichier.
Comment puis-je faire cela dans bash / shell? J'utilise Ubuntu 11.10. Merci.

Réponses:


11

Une simple boucle for avec un peu de sedfera l'affaire:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

Le regex de substitution dans seddit de faire correspondre cinq caractères ( .signifie n'importe quel caractère) au début de la chaîne ( ^) et de le supprimer.


9

Bash a des possibilités de script incroyables. Voici une façon:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

Un moyen pratique de tester ce qu'il ferait est d'ajouter un écho devant la commande:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

Les six points d'interrogation garantissent que vous n'effectuez cette opération qu'avec des noms de fichiers de plus de 5 caractères.


5

Vous pouvez utiliser sed pour ce faire

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done

5

Toutes les bonnes réponses, merci. C'est ce qui a fonctionné dans mon cas:

rename 's/^.......//g' *

1

Mes deux centimes':

for file in *; do mv $file ${file:5}; done

${file:n}supprime les premiers ncaractères de la chaîne file.


réponse la plus élégante.
— Sandwich
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.