86 votes

Comment changer l'extension de plusieurs fichiers de manière récursive depuis la ligne de commande ?

J'ai de nombreux fichiers avec .abc et je veux les changer en .edefg
Comment faire cela en ligne de commande ?

J'ai un dossier racine avec de nombreux sous-dossiers, la solution devrait donc fonctionner de manière récursive.

2voto

MvG Points 1456

J'utiliserais le commande mmv de la paquet du même nom :

mmv ';*.abc' '#1#2.edefg'

El ; correspond à zéro ou plus */ et correspond à #1 dans le remplacement. Le site * correspond à #2 . La version non récursive serait

mmv '*.abc' '#1.edefg'

0voto

KhoPhi Points 1878

C'est ce que j'ai fait et cela a fonctionné exactement comme je le voulais. J'ai utilisé le mv commande. J'ai eu plusieurs .3gp et je voulais tous les renommer en .mp4

Voici un petit oneliner à son sujet :

for i in *.3gp; do mv -- "$i" "ren-$i.mp4"; done

qui parcourt simplement le répertoire actuel, récupère tous les fichiers .3gp, puis les renomme (en utilisant le mv) en ren-name_of_file.mp4

0voto

user271471 Points 36

J'ai trouvé un moyen facile d'y parvenir. Pour changer les extensions de nombreux fichiers de jpg en pdf, utilisez :

for file in /path/to; do mv $file $(basename -s jpg $file)pdf ; done

0voto

Renommer les fichiers et les répertoires avec find -execdir | rename

Si vous avez l'intention de renommer à la fois des fichiers et des répertoires, et pas seulement avec un suffixe, alors c'est un bon modèle :

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

L'impressionnant -execdir fait un cd dans le répertoire avant d'exécuter la commande rename contrairement à la commande -exec .

-depth s'assurer que le renommage s'effectue d'abord sur les enfants, puis sur les parents, pour éviter les problèmes potentiels de répertoires parents manquants.

-execdir est nécessaire parce que rename ne fonctionne pas bien avec les chemins d'entrée qui ne sont pas des noms de base, par exemple, ce qui suit échoue :

rename 's/findme/replaceme/g' acc/acc

El PATH Le piratage est nécessaire car -execdir a un inconvénient très ennuyeux : find est extrêmement opiniâtre et refuse de faire quoi que ce soit avec -execdir si vous avez des chemins relatifs dans votre PATH variable d'environnement, par exemple ./node_modules/.bin à défaut de :

trouver : Le chemin relatif './node_modules/.bin' est inclus dans la variable d'environnement PATH, ce qui est peu sûr en combinaison avec l'action -execdir de find. Veuillez supprimer cette entrée de $PATH

Voir aussi : Pourquoi l'utilisation de l'action '-execdir' n'est pas sûre pour les répertoires qui sont dans le PATH ?

-execdir est un GNU find extension à POSIX . rename est basé sur Perl et provient du rename paquet. Testé dans Ubuntu 18.10.

Renommer le contournement de lookahead

Si vos chemins d'entrée ne proviennent pas de find ou si vous en avez assez de l'ennui des chemins relatifs, nous pouvons utiliser le lookahead de Perl pour renommer les répertoires en toute sécurité comme dans :

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

Je n'ai pas trouvé d'analogue pratique pour -execdir con xargs : https://superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686

El sort -r est nécessaire pour s'assurer que les fichiers viennent après leurs répertoires respectifs, puisque les chemins les plus longs viennent après les plus courts avec le même préfixe.

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