#1 Le 29/08/2021, à 22:10
- arnoxz
[RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Bonjour,
Depuis / dans un dossier, j'ai plusieurs fichiers qui ont des blancs dans leur noms, j'aimerais remplacer ces blancs par un tiret (signe "moins" - )....
Quelle commande puis-je, sans risque utiliser, car il y a énormément de fichiers mal nommés et les éditer à la main serait pénible, par contre ils contiennent des chiffres et doivent bien sur garder l'ordre chronologique "numérique" (mais je pense qu'il n'y a aucune interférence possible), il y a cependant plusieurs blancs dans le nom de fichier.
Par exemple : 2002 06 12_fichier.txt devrait être renommé 2002-06-12_fichier.txt
Cependant, certains sont déjà nommés correctement ("mix de style")
Merci d'avance,
Dernière modification par arnoxz (Le 31/08/2021, à 00:00)
Hors ligne
#2 Le 29/08/2021, à 22:21
- Watael
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
pour renommer des fichiers : ... rename
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 29/08/2021, à 22:46
- arnoxz
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Donc pour réitérer ma question proprement, je lance une boucle sur les fichiers d'un répertoire que je renomme, cette commande fonctionne bien ;
IFS=$'\n';for f in `find .`; do file=$(echo $f | tr [:blank:] '-'); [ -e $f ] && [ ! -e $file ] && mv -vi "$f" $file;done;unset IFS
Cependant que se passera t'il si un fichier de destination à déjà le nom à changer, puis-je ajouter (avec l'option -i de la commande mv) une option sur le stdrout (je pense que je suis dans le bon en citant cet aspect = alerte) afin d'alerter ou d'éviter de renommer un fichier qui existe déjà, l'idéal serait si fichier dest existe, d'alors rajouter lettre / chiffre en fin de nom (avant l'extension) ?
pour exemple :
le fichier 2021 08 30_Bonjour.txt serait renommé en 2021-08-30_Bonjour.txt
Comment éviter d'écraser un fichier qui aurait donc déjà le bon nom (2021-08-30_Bonjour.txt), comme je l'expliquais il existe déjà des mix de fichiers bien nommés et d'autres à renommer dans le dossier qui auraient peut-être déjà la bonne nomination du même jour ?
--> quelle est l'option pour arrêter / interaction (-i devrait suffire) le mv -i si le fichier de destination est déjà présent (la mieux serait de forcer à rajouter une lettre/chiffre en fin de nom de fichier au nom existant) ?
Finalement, c'est plutôt cette option que je recherche (et alors éliminer l'option -i pour automatiser) :
Si fichier dest existe, alors rajouter lettre / chiffre en fin de nom (avant l'extension) : par exemple : 2021-08-30_Bonjour_B.txt
[EDIT] et dans le pire des cas que se passe t'il si j'ai une chaîne de 2 (ou plus) de blancs à remplacer ? (je peux toujours relancer la commande cet aspect est moins important car logiquement les noms créés ne devraient dans mon cas ne contenir qu'un espace)
Merci
Si pas de réponse finalement, je m'en sors déjà pas mal avec ce parcours là.... je chercher peut-être trop "la sécurité".
Dernière modification par arnoxz (Le 30/08/2021, à 00:06)
Hors ligne
#4 Le 30/08/2021, à 00:31
- arnoxz
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Voici le résultat d'un test, alors avec l'option -i, le document existant déjà n'a pas été renommé, cependant, je n'ai pas reçu d'alerte qu'il existait déjà, ni qu'il n'a pas été renommé.... comment recevoir une alerte (ou renommer ce fichier avec une option supplémentaire dans le nom ,)
au cas ou il existe une alternative, sinon ca marche pas mal déjà :
arnoxz@MED-E15302:~/test$ ls -ltra
total 8
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 documS-ans-espace.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 'Document test.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 Doc-avec-des-espaces.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 'Doc avec des espaces.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 30 00:24 'Avec espace 2.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 30 00:25 'avaec encor esp.txt'
drwxrwxr-x 2 arnoxz arnoxz 4096 aoû 30 01:26 .
arnoxz@MED-E15302:~/test$ IFS=$'\n';for f in `find .`; do file=$(echo $f | tr [:blank:] '-'); [ -e $f ] && [ ! -e $file ] && mv -vi "$f" $file;done;unset IFS
renommé './Document test.txt' -> './Document-test.txt'
renommé './Avec espace 2.txt' -> './Avec-espace-2.txt'
renommé './avaec encor esp.txt' -> './avaec-encor-esp.txt'
arnoxz@MED-E15302:~/test$ ls -ltra
total 8
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 documS-ans-espace.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 Document-test.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 Doc-avec-des-espaces.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 avr 15 2019 'Doc avec des espaces.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 30 00:24 Avec-espace-2.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 30 00:25 avaec-encor-esp.txt
Hors ligne
#5 Le 30/08/2021, à 05:51
- pingouinux
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Bonjour,
Pour voir ce que fera la commande, sans rien modifier :
rename -n 's/ /-/g' *
Pour réellement modifier les noms, mais n'écrasera pas un fichier existant :
rename 's/ /-/g' *
Hors ligne
#6 Le 30/08/2021, à 13:48
- Watael
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
je le redis, on ne parcourt pas la sortie d'une Substitution de commandes avec une boucle for, parce que cette dernière itère sur les mots.
de plus, les fichiers peuvent aussi contenir des alinéas; en conséquence, fixer l'IFS à un retour chariot peut ne pas être judicieux.
si tu veux boucler sur la sortie de find :
find ... -print0 | while IFS='' read -r -d '' filename; do : ce que tu veux avec "$filename"; done
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 30/08/2021, à 14:00
- Hizoka
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Salut,
IFS=$'\n';for f in `find .`; do file=$(echo $f | tr [:blank:] '-'); [ -e $f ] && [ ! -e $file ] && mv -vi "$f" $file;done;unset IFS
Pour info :
- Ce n'est pas logique d'utiliser un coup `...` (celui du find) puis $(...) (celui du file), il vaut mieux utiliser la nouvelle façon $(...).
- Ton find renvoie aussi les dossiers alors que tu ne veux traiter que des fichiers à priori : find . -type f
- Par principe, je mettrais $file entre " : "$file"
- Et si tu tournes en bash, tu peux remplacer file=$(echo $f | tr [:blank:] '-') par file="${f//[[:blank:]]/-}" qui ira bien plus vite (environ 100 fois d'après un petit test).
- Il faut protéger ton $f : [ -e "$f" ]
- Tu peux éviter des pipes ( | ) inutiles qui rallongent le taf en remplaçant echo $f | tr [:blank:] '-' par tr [:blank:] '-' <<< "$f" (un peu plus rapide).
Mais ce ne sont que quelques remarques, la meilleure façon est celle proposée par pingouinux
Dernière modification par Hizoka (Le 30/08/2021, à 14:05)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 30/08/2021, à 23:51
- arnoxz
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
ok merci pour les conseils et remarques, et en effet, cela prend également les répertoires ce qui pourrait également aboutir à des problèmes...
Cette méthode me donnait jusque maintenant le résultat recherché bien que je sais que c'est un peu du bricolage...
Du coup, merci pingouinux, après test, j'adopte cette méthode plus courte (cela me fait penser à du PHP avec la même séquence pour la commande 'replace'), c'est efficace et m'annonce également si un fichier à été exclu, super, ce qui m'embête un peu est que cette commande 'rename' n'est pas native sur ubuntu (il faut l'installer, dommage).
Je suis très satisfait de ce résultat, c'est partit pour des milliers (ou centaines en tout cas) de modif.
Visu du test avec alerte en cas d'existence de fichier (les doubles et triples blancs sont pour le test, pas ma situation réelle) :
arnoxz@MED-E15302:~/test$ ls -ltra
total 8
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Un dernier pour la Rouuute.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Doc espace 202 12.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Doc-Double-ecrasement-possible.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Doc Double ecrasement possible.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Doc avec 3 espacespartout.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Autre Doc 1 espace.txt'
drwxr-xr-x 85 arnoxz arnoxz 4096 aoû 31 00:29 ..
drwxrwxr-x 2 arnoxz arnoxz 4096 aoû 31 00:37 .
arnoxz@MED-E15302:~/test$ rename -n 's/ /-/g' *
rename(Autre Doc 1 espace.txt, Autre-Doc-1-espace.txt)
rename(Doc avec 3 espacespartout.txt, Doc---avec---3---espacespartout.txt)
'Doc Double ecrasement possible.txt' not renamed: 'Doc-Double-ecrasement-possible.txt' already exists
rename(Doc espace 202 12.txt, Doc-espace-202-12.txt)
rename(Un dernier pour la Rouuute.txt, Un-dernier-pour-la-----Rouuute.txt)
arnoxz@MED-E15302:~/test$ rename 's/ /-/g' *
'Doc Double ecrasement possible.txt' not renamed: 'Doc-Double-ecrasement-possible.txt' already exists
arnoxz@MED-E15302:~/test$ ls -ltra
total 8
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Un-dernier-pour-la-----Rouuute.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Doc-espace-202-12.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Doc-Double-ecrasement-possible.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 'Doc Double ecrasement possible.txt'
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Doc---avec---3---espacespartout.txt
-rw-rw-r-- 1 arnoxz arnoxz 0 aoû 31 00:27 Autre-Doc-1-espace.txt
drwxr-xr-x 85 arnoxz arnoxz 4096 aoû 31 00:29 ..
drwxrwxr-x 2 arnoxz arnoxz 4096 aoû 31 00:38 .
Hors ligne
#9 Le 31/08/2021, à 06:37
- MicP
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
Bonjour
…ou renommer ce fichier avec une option supplémentaire dans le nom …
… en utilisant la commande mv par find avec le shell bash
michel@debbull:~$ mkdir ~/tests && cd ~/tests
michel@debbull:~/tests$
michel@debbull:~/tests$ touch "Un dernier pour la Rouuute.txt" 'Doc espace 202 12.txt' Doc-Double-ecrasement-possible.txt 'Doc Double ecrasement possible.txt' 'Doc avec 3 espacespartout.txt' 'Autre Doc 1 espace.txt' 'Doc-Double-ecrasement possible.txt' 'Doc-Double ecrasement-possible.txt' 'Doc Double-ecrasement-possible.txt'
michel@debbull:~/tests$
michel@debbull:~/tests$ ls -ltra
total 8
drwxr-xr-x 19 michel michel 4096 31 août 07:29 ..
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Un dernier pour la Rouuute.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc espace 202 12.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc-Double-ecrasement possible.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc-Double ecrasement-possible.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc Double-ecrasement-possible.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc Double ecrasement possible.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Doc avec 3 espacespartout.txt'
-rw-r--r-- 1 michel michel 0 31 août 07:29 'Autre Doc 1 espace.txt'
drwxr-xr-x 2 michel michel 4096 31 août 07:29 .
michel@debbull:~/tests$
michel@debbull:~/tests$ find . -type f -print0 | while IFS='' read -r -d '' filename; do mv --backup=numbered "$filename" "${filename// /-}" 2>/dev/null; done; ls -ltra
total 8
drwxr-xr-x 19 michel michel 4096 31 août 07:29 ..
-rw-r--r-- 1 michel michel 0 31 août 07:29 Un-dernier-pour-la-----Rouuute.txt
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-espace-202-12.txt
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt.~4~
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt.~3~
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt.~2~
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt.~1~
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc-Double-ecrasement-possible.txt
-rw-r--r-- 1 michel michel 0 31 août 07:29 Doc---avec---3---espacespartout.txt
-rw-r--r-- 1 michel michel 0 31 août 07:29 Autre-Doc-1-espace.txt
drwxr-xr-x 2 michel michel 4096 31 août 07:29 .
michel@debbull:~/tests$
michel@debbull:~/tests$ cd; rm -rf ~/tests
michel@debbull:~$
Dernière modification par MicP (Le 02/09/2021, à 19:22)
Hors ligne
#10 Le 02/09/2021, à 17:42
- arnoxz
Re : [RESOLU]Remplacer des "blancs" de nom de fichiers par un caractère
MicP : joli - je note également :-)
Hors ligne