Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile


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 smile

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

Dans son message #4, arnoxz a écrit :

…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