#1 Le 13/04/2026, à 23:18
- AlbertN
retirer caractères des noms de fichiers dossiers différents
Bonjour,
Je suis sous Xubuntu. Je veux synchroniser certains dossiers de mon ordinateur avec un tablette. Certains fichiers contenus dans ces dossiers ne peuvent être synchronisés car ils contiennent des caractères (: ? * ">< etc), qu'android n'accepte pas dans les noms de fichiers.
J'ai vu qu'il existe des solutions en ligne de commande pour renommer ces fichiers, mais je ne maîtrise pas suffisamment.
J'ai vu qu'il existe des logiciels comme GPrename, mais on ne peut renommer les fichiers que dans un dossier à la fois (et pas les sous dossiers).
Je souhaiterais qu'on m'indique une commande permettant de trouver tous les fichiers dont le nom contient un caractère donné (par exemple "?") dans un dossier et tous ses sous-dossiers et de remplacer le caractère en question par un espace automatiquement.
Ou qu'on m'indique s'il existe un logiciel comme GPrename, mais qui permette de sélectionner automatiquement tous les fichiers contenus dans des dossiers et des sous-dossiers pour les renommer.
J'espère que je suis assez clair, et merci si quelqu'un peut m'aider.
Dernière modification par AlbertN (Le 14/04/2026, à 12:06)
Hors ligne
#2 Le 14/04/2026, à 01:57
- MicP
Re : retirer caractères des noms de fichiers dossiers différents
Bonjour
…une commande permettant de trouver tous les fichiers dont le nom contient un caractère donné (par exemple "?") dans un dossier et tous ses sous-dossiers et de remplacer le caractère en question par un espace automatiquement. …
J'ai créé un répertoire ~/repTest dans lequel j'ai créé un sous-répertoire dans lequel j'ai créé un autre sous-répertoire.
Dans chacun de ces répertoires et sous-répertoires j'ai créé quelques fichiers.
Certains de ces noms de fichier et de sous-répertoire contiennent des caractères qui sont dans la liste suivante :
:?*"><Dans la ligne de commande que je te propose, j'ai "échappé" chacun des caractères de cette liste en le faisant précéder d'un caractère "\"
ce qui fait que, dans la ligne de commande, le contenu de la liste des caractères devient :
\:\?\*\"\>\<Ce qui donne, dans la ligne de commandes :
lst='\:\?\*\"\>\<'; repl=' '; find . -depth -name '*['$lst']*' -execdir bash -c '[ -f "${1//[$2]/$3}" ] || mv "$1" "${1//[$2]/$3}"' _ {} "$lst" "$repl" \;=======
Et voilà ce que ça donne dans mon arborescence de test :
mic@deb13x:~/repTest$ tree # Avant d'avoir lancé la ligne de commandes :
.
├── avec espace
├── bla:bla
├── bl>bl
├── ble<ble
├── bli?bli
├── blo*blo
├── blu"blu
├── normal
├── so<us-r*ep
│ ├── avec espace
│ ├── bla:bla
│ ├── bl>bl
│ ├── ble<ble
│ ├── bli?bli
│ ├── blo*blo
│ ├── blu"blu
│ ├── normal
│ ├── sous<-sous>-rep
│ │ ├── avec espace
│ │ ├── bla:bla
│ │ ├── bl>bl
│ │ ├── ble<ble
│ │ ├── bli?bli
│ │ ├── blo*blo
│ │ ├── blu"blu
│ │ ├── normal
│ │ └── xx:?xx*xx"xx
│ └── xx:?xx*xx"xx
└── xx:?xx*xx"xx
3 directories, 27 files
mic@deb13x:~/repTest$ Après avoir lancé la ligne de commandes,
dans les noms des fichiers et des répertoires de toute l'arborescence depuis laquelle (ici, c'est ~/repTest/) j'aurai lancé la commande,
chaque caractère (échappé) de la liste lst sera remplacé par le caractère (ici, j'ai mis une espace) ou la chaîne de caractères (qui pourrait être vide) qui sera dans la variable nommée repl
mic@deb13x:~/repTest$ lst='\:\?\*\"\>\<'; repl=' '; find . -depth -name '*['$lst']*' -execdir bash -c '[ -f "${1//[$2]/$3}" ] || mv "$1" "${1//[$2]/$3}"' _ {} "$lst" "$repl" \;
mic@deb13x:~/repTest$
mic@deb13x:~/repTest$ tree # Après avoir lancé la ligne de commandes :
.
├── avec espace
├── bla bla
├── bl bl
├── ble ble
├── bli bli
├── blo blo
├── blu blu
├── normal
├── so us-r ep
│ ├── avec espace
│ ├── bla bla
│ ├── bl bl
│ ├── ble ble
│ ├── bli bli
│ ├── blo blo
│ ├── blu blu
│ ├── normal
│ ├── sous -sous -rep
│ │ ├── avec espace
│ │ ├── bla bla
│ │ ├── bl bl
│ │ ├── ble ble
│ │ ├── bli bli
│ │ ├── blo blo
│ │ ├── blu blu
│ │ ├── normal
│ │ └── xx xx xx xx
│ └── xx xx xx xx
└── xx xx xx xx
3 directories, 27 files
mic@deb13x:~/repTest$ =======
Cette ligne de commandes traite tous les fichiers du répertoire courant et de son arborescence, (le point, dans la ligne de commandes est un raccourci vers le répertoire courant)
mais si tu connais le chemin absolu du répertoire par lequel tu veux commencer à renommer tous les fichiers qu'il contiendrait ainsi que ses sous-répertoires et tout ce qu'ils contiendraient
tu peux remplacer le point qui est dans la ligne de commandes par ce chemin absolu
Donc, si tu voulais commencer le renommage par le répertoire "/home/albertn/mes_fichiers/à renommer/"
tu pourrais, depuis le répertoire personnel de ton compte utilisateur, lancer la ligne de commandes suivante :
lst='\:\?\*\"\>\<'; repl=' '; find "/home/albertn/mes_fichiers/à renommer/" -depth -name '*['$lst']*' -execdir bash -c '[ -f "${1//[$2]/$3}" ] || mv "$1" "${1//[$2]/$3}"' _ {} "$lst" "$repl" \;EDIT: J'ai ajouté un test pour que des fichiers ne puissent pas être renommés si leur nouveau nom correspondait à un fichier déjà existant.
Après avoir lancé la ligne de commande, on peut lancer celle qui suit pour lister les fichiers qui n'auraient pu être renommés :
find "/home/albertn/mes_fichiers/à renommer/" -name '*['$lst']*'Dernière modification par MicP (Le 14/04/2026, à 08:58)
Hors ligne
#3 Le 14/04/2026, à 08:11
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
Bonjour , voir ça : https://forum.ubuntu-fr.org/viewtopic.php?id=2068750
et pour finir : https://forum.ubuntu-fr.org/viewtopic.p … #p22832549
le script traite pas mal de choses dont :
# remplacement d'un maxima de caractères interdits par windows : ><\:"|?* par " _ "
on peut le lancer du dossier désiré directement a partir du terminal ou indiqué le chemin a traiter recursivement.
il a été éprouvé sur une grande quantité de noms de fichiers différents .
Si jamais des erreurs persistent , il est améliorable par les contributeurs du forum .
Dernière modification par iznobe (Le 14/04/2026, à 08:23)
Hors ligne
#4 Le 14/04/2026, à 10:41
- MicP
Re : retirer caractères des noms de fichiers dossiers différents
Celle-là renomme ce qui peut l'être et liste les fichiers qui n'ont pas pu être renommés en proposant une solution efficace.
lst='\:\?\*\"\>\<'; repl=' '; find '/home/albertn/mes_fichiers/à renommer/' -depth -name '*['$lst']*' | while read f; do p="${f%/*}"; n="${f##*/}"; n2="${n//[$lst]/ }"; [ -f "$p/${n//[$lst]/ }" ] && echo "'$p/$n' n'a pas pu être renommé en '$n2' car ce nom de fichier exite déjà. Essayez d'utiliser un autre caractère de remplacement." || mv "$p/$n" "$p/$n2"; doneExemple de message sorti :
'/home/albertn/mes_fichiers/à renommer/ble<ble' n'a pas pu être renommé en 'ble ble' car ce nom de fichier existe déjà. Essayez d'utiliser un autre caractère de remplacement.Dernière modification par MicP (Le 14/04/2026, à 10:45)
Hors ligne
#5 Le 14/04/2026, à 11:44
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Merci infiniment, je vais regarder tout ça !
Hors ligne
#6 Le 14/04/2026, à 12:08
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Oups, dernier petit problème : je me retrouve avec des espaces en début ou en fin de nom de fichier, ce qui me pose des problèmes avec une autre synchro...
Est-ce qu'une commande est possible uniquement pour supprimer ces espaces là ?
merci
Hors ligne
#7 Le 14/04/2026, à 14:12
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
le script traite aussi les espaces avant et en fin de noms de fichiers .
Hors ligne
#8 Le 14/04/2026, à 17:03
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Merci, j'ai regardé le script, mais j'ai eu peur de me perdre, ça reste un peu compliqué pour moi. J'ai utilisé la commande indiquée par MicP et je suis preneur s'il y a juste une commande similaire pour supprimer les espaces de début et de fin.
Hors ligne
#9 Le 14/04/2026, à 17:11
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
pour le script c ' est plutôt simple ( si tu n' as jamais fait , la 1ere fois ça peut faire un peu peur mais en fait c ' est pa dûr ) :
il suffit de copier le script et de l ' enregistrer dans un fichier que tu appelles par exemple : " rename.sh " et que tu enregistres directement dans ton dossier Documents (perso je mettrai pas là , mais c ' est pour l' exemple ) .
ensuite , tu ouvres un terminal , tu fais un :
cd /chemins vers dossier a traiterdisons que tu veux travailler dans le dossier Images de ton home , ça donne alors :
cd ~/Imagesensuite il ne reste plus qu ' a faire :
bash ~/Documents/rename.shEt c' est tout .
Par défaut , le script ne fait aucune modification , mais il permet de visualiser tout ce qu ' il modifiera ensuite , car la variable :
# variables a ajuster : modif_activ=false # mettre : true pour appliquer les modifications , false pour visualiser les noms sans les modifier
est à " false " .
tu remplaces :
modif_activ=falsepar
modif_activ=truetu relances le script , et là il fera les modifications pour de vrai .
C ' est pas si sorcier finalement non ?
Dernière modification par iznobe (Le 14/04/2026, à 17:15)
Hors ligne
#10 Le 14/04/2026, à 17:13
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Merci, mais, sauf si j'ai mal compris, le script fait davantage de modifications que ce que je souhaite sur les noms de fichiers, non ?
Hors ligne
#11 Le 14/04/2026, à 17:18
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
ben non . il met tout les noms de fichiers et dossier en conformité avec " la logique windows " . et c ' est pile ce que tu veux faire , supprimer les caractères spéciaux , les espaces au début et à la fin des noms ...
Et de toute manière , lancer le script avec la variable " modif_active=false " ne fait rien , mais permet de visualiser ce qui sera fait si tu la passes a " true ."
EDIT : ha si il fait un truc en plus , dans le cas ou un fichier se nomme "a b" , il le renommera en "a b" ou "a_b" .
le script enregistre aussi toutes les modifications effectuées dans un fichier log ( au cas ou ) et note aussi toutes les erreurs dans un autre fichier , tous deux dans le dossier /tmp ( ils s ' effaceront tout seul après un redémarrage par contre ) .
Mais bon rien qu ' avec la prévisualisation déjà , ça aide vachement bien a s ' y retrouver .
Dernière modification par iznobe (Le 14/04/2026, à 17:24)
Hors ligne
#12 Le 14/04/2026, à 18:40
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Bon, je ne sais pas si je m'y prends bien. Je n'arrive pas à supprimer uniquement les espaces de début ou de fin de fichier. Soit ça les laisse si je mets all_spaces=false, soit ça les remplace tous (et pas seulement ceux de début et de fin) par un "_" si je mets sur "true", ce qui n'est pas vraiment ce que je souhaitais. Si ça n'est pas possible, tant pis.
Hors ligne
#13 Le 14/04/2026, à 19:23
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
Si tu désires ne faire que supprimer les espaces au début et à la ffin des noms , tu remplaces :
nomModif=$( echo "$nomModif" | tr '><"|?*:\\' '________%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacépar
nomModif=$(echo "$nomModif")Si tu désires traiter les espaces au début et à la fin et remplacer les caracteres spciaux , alors il te suffit de mettre :
nomModif=$( echo "$nomModif" | tr '><"|?*:\\' '________%' ) # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacé
nomModif=$(echo "$nomModif")Hors ligne
#14 Le 14/04/2026, à 21:31
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
J ' ai modifié le script pour qu ' il fonctionne correctement et enleve tous les espaces avant et apres chaque nom dans toute l' arborescence .
Dis vois si maintenant il fonctionne correctement chez toi .
Hors ligne
#15 Le 15/04/2026, à 09:25
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Si je mets modif_activ=true , ":" est remplacé par % et "?" par "_" (je n'ai testé que sur un fichier)
Si je mets aussi all_spaces=true, les caractères spéciaux et les espaces sont remplacés par "_"
Du coup, je ne vois pas trop la différence
Hors ligne
#16 Le 15/04/2026, à 09:38
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
j ' ai modifié le script , la partie qui est censée en lever les espaces devant et apres n ' était pas prise en charge .
Le script corrigé est là : https://forum.ubuntu-fr.org/viewtopic.p … #p22891221
all_spaces , comme indiqué par son nom et dans le commentaire , remplace tous les espaces par le caractère associé , c ' est à dire " _" .
tu n' as normalement pas besoin de l' activer , sauf si effectivement tu veux faire ce qui est décrit.
Si tu désires ne pas remplacer un caractère spécial , par exemple " ? " , tu peux modifier le script .
C ' est cette ligne qui gere :
else
nomModif=$(echo $nomModif | tr '><"|?*\\:' '_______%') # echappement de "\" par le meme signe donc 2 \\ pour qu un soit remplacéil suffit alors de supprimer le " ? " et son caractere associé :
tr '><"|?*\\:' '_______%'devient alors :
tr '><"|*\\:' '______%'cela ne se voit pas forcément au 1er coup d ' oeil , mais j ' ai supprimé un des " _ " qui sont dans les apostrophes et le " ? " de l ' autre coté dans les apostrophes aussi , bien entendu .
Dernière modification par iznobe (Le 15/04/2026, à 09:44)
Hors ligne
#17 Le 15/04/2026, à 10:00
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Oui, c'est cette version du script que j'ai utilisé.
Si je mets modif_activ=true, le fichier "fichier : test ? .odt" est renommé "fichier % test _ .odt"
Si je mets aussi all_spaces=true, le même fichier "fichier : test ? .odt" est renommé "fichier___test___.odt"
Hors ligne
#18 Le 15/04/2026, à 10:09
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
Si je mets modif_activ=true, le fichier "fichier : test ? .odt" est renommé "fichier % test _ .odt"
oui , ça me semble normal . il n ' y a pas d' espace devant , ni à la fin .
Si je mets aussi all_spaces=true, le même fichier "fichier : test ? .odt" est renommé "fichier___test___.odt"
cela me semble normal aussi . les espaces multiples consécutifs sont transformés , soit en un seul espace , soit en " _ " pour tous les espaces si all_spaces est activé .
normalement , par contre , le " : " devrait être transformé dans tous les cas ( all_spaces ou pas ) , en " % " .
Que voudrais tu obtenir comme résultat avec le nom de fichier : "fichier : test ? .odt" ?
Dernière modification par iznobe (Le 15/04/2026, à 10:49)
Hors ligne
#19 Le 15/04/2026, à 10:49
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
j ' ai re modifié le script , il semble qu ' il y avait un " _ " en trop pour la version all_spaces ![]()
Normalement ça devrait être bon maintenant...
PS :il n' est pas nécessaire ( ni conseillé ) d ' activer les modifications pour voir le résultat .
voici ce que ça donne , avec la derniere modif , sur un fichier de test du nom de : " test: fichier de test % ? "
iznobe@m-pi3:~/test $ nano " test: fichier de test % ? "
iznobe@m-pi3:~/test $ ~/rename.sh
-bash: /home/iznobe/rename.sh: Permission non accordée
iznobe@m-pi3:~/test $ bash ~/rename.sh
renommage du fichier : mv /home/iznobe/test/ test: fichier de test % ? ==> /home/iznobe/test/test% fichier de test % _
1 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés
0 fichiers , 0 répertoires n ' ayant pas pu etre modifiés , le tout en 0 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/home/iznobe/test' -type d -empty -delete
iznobe@m-pi3:~/test $ nano ~/rename.sh
iznobe@m-pi3:~/test $ bash ~/rename.sh
renommage du fichier : mv /home/iznobe/test/ test: fichier de test % ? ==> /home/iznobe/test/test%_fichier_de_test_%__
1 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés
0 fichiers , 0 répertoires n ' ayant pas pu etre modifiés , le tout en 0 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/home/iznobe/test' -type d -empty -delete
iznobe@m-pi3:~/test $ ça me parait conforme là .
Dernière modification par iznobe (Le 15/04/2026, à 11:01)
Hors ligne
#20 Le 15/04/2026, à 11:25
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Pas de changement chez moi :
un fichier " test : fichier ? .odt" (avec espace au début et à la fin) devient "test % fichier _ .odt" avec modif_activ=true . L'espace du début est supprimé mais pas celui de la fin.
Si j'active aussi all_spaces=true, le même fichier " test : fichier ? .odt" (avec espace au début et à la fin) devient "test_%_fichier___.odt"
Hors ligne
#21 Le 15/04/2026, à 12:03
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
bon en fait , le probleme c ' est la commande tr ... mais je cherche toujours car pas moyen .
Hors ligne
#22 Le 15/04/2026, à 13:29
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
Essaie le script dans sa derniere modification et dis voir .
Chez moi sur un dossier test , j ' obtiens ( en version all_spaces ) :
mer. avril 15 13:24:19 iznobe@iznobe-pc:~/Scripts/test$ bash ~/Scripts/rename.sh
renommage du fichier : mv '/home/iznobe/Scripts/test/><"|?*\ :' ==> '/home/iznobe/Scripts/test/________%'
renommage du fichier : mv '/home/iznobe/Scripts/test/ bash.sh ' ==> '/home/iznobe/Scripts/test/bash.sh'
renommage du fichier : mv '/home/iznobe/Scripts/test/COM6' ==> '/home/iznobe/Scripts/test/COM6_'
renommage du fichier : mv '/home/iznobe/Scripts/test/ test : .ino ' ==> '/home/iznobe/Scripts/test/test_%_.ino'
4 répertoires et fichiers traités, 0 répertoires modifiés, 0 fichiers modifiés
0 fichiers , 0 répertoires n ' ayant pas pu etre modifiés , le tout en 1 secondes.
liste des fichiers modifiés dans '/tmp/modifs'
liste des erreurs dans '/tmp/error.log'
pour supprimer les dossiers vides , copiez collez la commande suivante : find '/home/iznobe/Scripts/test' -type d -empty -delete
mer. avril 15 13:27:51 iznobe@iznobe-pc:~/Scripts/test$ ce qui me parait conforme au 1er abord .
Dernière modification par iznobe (Le 15/04/2026, à 13:31)
Hors ligne
#23 Le 15/04/2026, à 14:14
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
J'obtiens exactement le même résultat qu'au #20 :
un fichier " test : fichier ? .odt" (avec espace au début et à la fin) devient "test % fichier _ .odt" avec modif_activ=true . L'espace du début est supprimé mais pas celui de la fin.
Si j'active aussi all_spaces=true, le même fichier " test : fichier ? .odt" (avec espace au début et à la fin) devient "test_%_fichier___.odt"
Hors ligne
#24 Le 15/04/2026, à 16:41
- iznobe

Re : retirer caractères des noms de fichiers dossiers différents
la fin du fichier est après l' extension .
toi tu voudrais que :
"xxx .odt"
devienne :
"xxx.odt"
si je comprends bien ?
Hors ligne
#25 Le 15/04/2026, à 17:04
- AlbertN
Re : retirer caractères des noms de fichiers dossiers différents
Oui, je voudrais pouvoir supprimer l'espace final sans remplacer les autres si possible :
Que "xxx xxx .odt" devienne "xxx xxx.odt" ou à la rigueur "xxx xxx_.odt"
Hors ligne