Renommez plusieurs fichiers en shell

J’ai plusieurs fichiers dans un répertoire, par exemple: linux_file1.mp4 , linux_file2.mp4 et ainsi de suite. Comment déplacer ces fichiers, en utilisant shell, de sorte que les noms sont file1.mp4 , file2.mp4 et ainsi de suite. J’ai environ 30 fichiers que je veux déplacer vers le nouveau nom.

J’aime mmv pour ce genre de chose

 mmv 'linux_*' '#1' 

Mais vous pouvez également utiliser rename . Sachez qu’il existe généralement deux commandes de rename avec une syntaxe très différente. L’un est écrit en Perl, l’autre est dissortingbué avec util-linux, je les distingue donc comme “perl rename” et “util rename” ci-dessous.

Avec Perl renommer:

 rename 's/^linux_//' linux_*.mp4 

Comme cweiske l’a bien fait remarquer.

Avec util renommer:

 rename linux_ '' linux_*.mp4 

Comment pouvez-vous dire quel nom vous avez? Essayez de rename -V ; Si votre version est renommée, elle imprimera le numéro de version et si elle est en version Perl, elle renverra son nom de manière inoffensive et l’option inconnue sera affichée.

Si vous n’avez ni rename ni mmv et que vous ne voulez pas ou ne pouvez pas les installer, vous pouvez toujours le faire avec le vieux code shell:

 for file in linux_*.mp4 ; do mv "$file" "${file#linux_}" ; done 

Cette syntaxe fonctionnera avec tous les POSIX sh conformes à XPG4 ou ultérieur, qui sont essentiellement tous les shells de nos jours.

 $ rename 's/linux_//' linux_*.mp4 

Une manière simple et native de le faire, avec traversée de répertoire :

 find -type f | xargs -I {} mv {} {}.txt 

Renommera chaque fichier en place en ajoutant l’extension .txt à la fin.

Et une manière plus générale avec la parallélisation :

 find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:10}trump${f:4}' 

J’ai pu remplacer les noms de fichiers dans les répertoires en combinant les réponses @dtrckd et @Sorpigal.

 for file in `find -name "linux_*.mp4"`; do mv "$file" "${file/linux_/}" ; done