web-dev-qa-db-fra.com

Comment remplacer un caractère par un autre dans tous les noms de fichiers des répertoires actuels?

Comment renommer tous les fichiers/sous-répertoires du dossier actuel?

Disons que j'ai de nombreux fichiers et sous-répertoires contenant des espaces et que je souhaite remplacer tous les espaces par un trait de soulignement.

File 1
File 2
File 3
Dir 1
Dir 3

devrait être renommé en

File_1
File_2
File_3
Dir_1
Dir_3
43
NobbZ

Si vous devez également renommer des fichiers dans des sous-répertoires et que votre find prend en charge le -execdir prédicat, alors vous pouvez faire

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Merci à @glenn jackman d'avoir suggéré -depth option pour find et pour me faire réfléchir.

Notez que sur certains systèmes (y compris GNU/Linux), find peut ne pas trouver de fichiers dont le nom contient des espaces et également des séquences d'octets qui ne forment pas des caractères valides (généralement avec des fichiers multimédias avec des noms avec des non Caractères ASCII encodés dans un jeu de caractères différent de celui des paramètres régionaux). Définition des paramètres régionaux sur C (comme dans LC_ALL=C find...) résoudrait le problème.

37
enzotib

Dans n'importe quel shell, vous pouvez parcourir les fichiers dont le nom contient un espace. Remplacer les espaces par des traits de soulignement est facile en bash, ksh et zsh avec le ${VARIABLE//PATTERN/REPLACEMENT} construire.

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

Sur Debian, Ubuntu et dérivés, vous pouvez utiliser Perl rename (d'autres distributions livrent un programme différent comme rename, et ce programme n'est pas utile ici).

rename 's/ /_/g' *

Une solution zsh obligatoire:

autoload zmv
zmv '(*)' '${1// /_}'

Une solution POSIX obligatoire:

for x in *" "*; do
  y=$(printf %sa "$x" | tr " " "_")
  mv -- "$x" "${y%a}"
done

Vous pouvez utiliser rename pour cela (en supposant ici celui de util-linux, pas le Perl one):

cd /path/to/dir
rename ' ' _ *\ *

Cela trouvera tous les fichiers et répertoires dans le nom et remplacera l'espace par un trait de soulignement. Puisqu'il utilise la correspondance de fichiers glob, vous devez être dans le bon répertoire pour commencer.

Si vous voulez faire des correspondances récursives, vous pouvez, mais vous devrez peut-être exécuter le rename plusieurs fois pour intercepter tous les éléments des répertoires qui ont eux-mêmes été renommés:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
13
Caleb

Une autre option serait mmv, si elle est installée.

mmv \*\ \* \#1_#2
2
glglgl

Sur Debian/Ubuntu, en s'appuyant sur les réponses de Caleb et Gilles, c'est ce qui a fonctionné pour moi pour renommer les fichiers de manière récursive:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Remarque: Pour prévisualiser les fichiers qui seront renommés et comment, utilisez le -n changer avec rename:

rename -n 's/ /_/g' **

Autre remarque: définir globstar fait ** correspond aux fichiers dans tous les sous-répertoires, donc si seul le répertoire courant est souhaité, ne définissez pas globstar ou utilisez * au lieu de **.

Encore une remarque: la commande rename doit être exécutée plusieurs fois pour les fichiers avec plusieurs occurrences du terme de recherche.

1
Markus Pscheidt

Si vous n'êtes pas un éclair aux expressions régulières (je ne le suis pas!), Et que vous pouvez exécuter des applications conçues pour kde (soit vous utilisez kde - k desktop ou vous avez ses bibliothèques installées), alors krename est un excellent utilitaire graphique qui vous permet de voir avant et après avant de vous engager dans les modifications. Il a un certain nombre de transformations simples en option et prend également en charge les expressions régulières. Vous pouvez même combiner plusieurs transformations séquentielles en un seul renommage afin de ne pas avoir à concevoir une seule transformation complexe qui le fasse tout à la fois. Il a également une option pour continuer à renommer les mêmes fichiers après qu'un renommage a été appliqué.

Je ne l'utilise pas souvent, mais quand je le fais, il fait vraiment le travail rapidement et facilement. Il est très pratique pour renommer divers fichiers multimédias téléchargés afin que vous puissiez les gérer uniformément sur votre système. Il est utile de télécharger le manuel de krename séparément afin de pouvoir vous y référer lorsque vous utilisez le programme.

http://www.krename.net/

0
Joe