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.