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/10/2021, à 15:00

Terminus78

[Résolu] Script parcours arborescence pour renommage

Bonjour à tous,

Je me permets de faire appel à votre aide car je galère un peu ...

Je souhaiterais créer un script me permettant de parcourir un dossier donné et ses sous-dossiers, dans le but de renommer tous les fichiers qu'ils trouvent disposant d'un caractère "+" dans son nom (à remplacer par un espace).

J'espère que je me suis bien expliqué ?

J'ai essayé ce bout de code mais sans résultat :

#où $1 correspond au répertoire de départ visé, entré en paramètre
 for f in "$1"/*; do 
        mv $f ${f/+/ };
        echo "$f"
    done

Une idée ?
Merci à vous !

Dernière modification par Terminus78 (Le 18/11/2021, à 16:14)

Hors ligne

#2 Le 29/10/2021, à 16:08

geole

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour
Je te conseille de remplacer par un underscore plutôt qu'un espace
voir https://forum.ubuntu-fr.org/viewtopic.php?id=1183201

for f in *+*; do mv -v "$f" $(echo "$f" | tr '+' '_'); done
renommé 'Fic+Fac' -> 'Fic_Fac' 

Dernière modification par geole (Le 30/10/2021, à 09:19)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

En ligne

#3 Le 29/10/2021, à 16:47

Tawal

Re : [Résolu] Script parcours arborescence pour renommage

Hello,

Avec find et rename sans boucle :

find "$1" -type f -iname "*+*" -exec rename 's/\+/ /g' {} \;

Ou avec la boucle for et mv :

shopt -s nullglob globstar; for f in "$1"/**/*+*; do mv "$f" "${f//+/ }"; done

Essais :

$ touch f+f t+t g+g
$ ls -l
total 0
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 f+f
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 g+g
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 t+t
$ find . -type f -iname "*+*" -exec rename 's/\+/ /g' {} \;
$ ls -l
total 0
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 'f f'
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 'g g'
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 't t'
$ rm *
$ touch f+f t+t g+g
$ shopt -s nullglob globstar; for f in ./**/*+*; do mv "$f" "${f//+/ }"; done
$ ls -l
total 0
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 'f f'
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 'g g'
-rw-r--r-- 1 tawal tawal 0 29 oct.  17:46 't t'
$

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 Le 29/10/2021, à 22:33

kamaris

Re : [Résolu] Script parcours arborescence pour renommage

Puisque rename le permet, autant profiter de la version rapide pour le find :

find "$1" -type f -name '*+*' -exec rename 's/\+/ /g' {} +

Hors ligne

#5 Le 30/10/2021, à 09:16

geole

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour.
Il me semble que le logiciel rename sera à installé pour être utilisé.

sudo apt install rename

Puis pour faire plus simple

cd /répertoire de niveau supérieur à examiner
find   . -type f -name '*+*' -exec rename -v 's/\+/_/g' {} +

Ajout. Du coup, tu n'as plus besoin de fabriquer un script qui va nécessiter de fournir un paramètre que tu pourrais mal orthographier. Avec la commande cd tu sais immédiatement que c'est bon.

Je te rappelle que mettre un espace dans un nom de fichier va compliquer son accès en ligne de commande.

Dernière modification par geole (Le 31/10/2021, à 16:55)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

En ligne

#6 Le 31/10/2021, à 15:50

kamaris

Re : [Résolu] Script parcours arborescence pour renommage

Bof, c'est pas tellement plus simple et changer de répertoire dans un script est à éviter autant que possible (ou alors dans un sous shell quand c'est nécessaire).
Si le but est de simplifier l'affichage de rename, on peut faire :

find "$1" -type f -name '*+*' -execdir rename 's/\+/ /g' {} +

Hors ligne

#7 Le 02/11/2021, à 15:08

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour à tous et merci bcp pour vos retours.

J'ai essayé vos différentes solutions mais à chaque fois il ne se passe ... rien.
J'avoue que je ne comprends pas trop, pas de msg d'erreur, ni quoi que ce soit, juste rien du tout.

Une idée du problème ?

Hors ligne

#8 Le 02/11/2021, à 15:20

geole

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour
Poste le retour de ces deux commandes en mettant une vraie valeur dans le répertoire

cd /répertoire de niveau supérieur à examiner
find   . -type f -name '*+*' -exec rename -v 's/\+/_/g' {} +

Si tu n'as aucune réponse, c'est que tout est bon.
Les autres commandes jugeaient inutile de t'informer des corrections exécutées

Dernière modification par geole (Le 02/11/2021, à 15:22)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

En ligne

#9 Le 02/11/2021, à 17:33

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Mea culpa, enfaite ce bout de script fonctionne parfaitement :

shopt -s nullglob globstar; for f in "$1"/**/*+*; do mv "$f" "${f//+/ }"; done

Merci encore smile

Cependant j'ai désormais un autre soucis, j'essaie ceci :

for f in "$1"/**/*; do
	mv "$f" "${f//LM*--original--/}";
done

J'ai plusieurs fichiers qui commencent par LM*--original-- (où * est une suite de caractère, un peu comme un ID) et j'aimerais tout simplement supprimer ce début de nom de fichier.
Cependant, en faisant ceci, mon bout de script range mes fichiers dans le dossier supérieur ... Une idée ?

Hors ligne

#10 Le 02/11/2021, à 17:36

Watael

Re : [Résolu] Script parcours arborescence pour renommage

tu dois d'abord récupérer le nom du répertoire et le nom du fichier séparément : tout ce qui est avant le dernier / et tout ce qui est après le dernier /.

cf. man bash /Remplacement de paramètres

Dernière modification par Watael (Le 02/11/2021, à 17:37)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 04/11/2021, à 15:09

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour,

Désolé mais je n'ai pas saisi la notion.
De plus, je ne comprends pas pourquoi ca, ça marche :

for f in "$1"/**/*+*; do
        mv "$f" "${f//+/ }"; 
done

Et cela non :

for f in "$1"/**/*; do
	mv "$f" "${f//LM*--original--/}";
done

Hors ligne

#12 Le 04/11/2021, à 15:52

Watael

Re : [Résolu] Script parcours arborescence pour renommage

montre-nous des \ls -1 :
- avant suppression des +
- après suppression des +
qu'on voit à quoi ressemblent les noms des fichiers.

EDIT :
c'est les mêmes fichiers ? alors, pourquoi deux boucles ?
shopt est positionné de la même manière ?

Dernière modification par Watael (Le 04/11/2021, à 16:04)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 04/11/2021, à 16:46

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

@Watael :

Voici le répertoire d'origine on va dire :

user1@grp1:...8cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test $ ls -1
Original
Generated
LM706561
LM706595
LM711990
LM711991
LM714536
LM714537
LM714538
LM719281
LM719940
LM720472
LM720567
LM721725
XML_2021-11-02.xml

Ce que je souhaite du coup c'est que mon script parcours tous les dossiers (et leurs sous-dossiers) ici présent.

Je vais prendre du coup l'exemple du dossier LM706561 :

user1@grp1:...8cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706561 $ ls -1
Original
Generated
LM706561--original--TV+and+web+marketing+intelligence+-+Nov+2021.xlsx

Tous les dossiers sont composés de la même façon, les fichiers débutant par *original* se rangent à la racine, et les *generated* dans le dossier /Generated.
Du coup mon script et censé faire une passe sur ce dossier, modifier le nom du fichier (il devrait donc s’appeler : TV and web marketing intelligence - Nov 2021.xlsx et surtout rester à cet endroit), et faire une passe dans les sous-dossiers original et generated, et effectuer la même chose (au cas où il y a une coquille et aussi car j'améliorais aussi mon script après pour faire le même travail sur les fichiers débutant par LM*generated* ...

Donc tout ca c'était avant la suppression des +.
Après la suppression des + (si je n'ajoute pas la boucle pour le renommage des LM*original*) : C'est simple, mes fichiers sont bien renommés, les + sont retirés et les fichiers n'ont pas sauté de repertoires.

Maintenant si j'ajoute la boucle pour le renommage des LM*original* : Mes fichiers sont bien renommés, mais ce retrouve un cran au dessus au niveau de mon arborescence.

EDIT : La deuxième boucle est en effet inutile en soit, c'était pour des tests mais à terme tout sera rangé dans la même boucle tant qu'à faire smile

Dernière modification par Terminus78 (Le 04/11/2021, à 16:47)

Hors ligne

#14 Le 04/11/2021, à 17:13

Watael

Re : [Résolu] Script parcours arborescence pour renommage

$ set -- /tmp
$ >"$1/LM706561--original--TV+and+web+marketing+intelligence+-+Nov+2021.xlsx"
$ ls "$1"/LM*
/tmp/LM706561--original--TV+and+web+marketing+intelligence+-+Nov+2021.xlsx
$ for f in "$1"/*+*; do sansPlus="${f//+/ }"; mv "$f" "$sansPlus"; mv "$sansPlus" "${sansPlus//LM*--original--}"; done
$ ls "$1"/TV*
'/tmp/TV and web marketing intelligence - Nov 2021.xlsx'
$

Dernière modification par Watael (Le 09/11/2021, à 14:35)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 09/11/2021, à 14:27

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Désolé pour mon retour tardif.

@Watael, merci de ton retour. J'ai essayé ta solution, plus de message d'erreur mais de mon côté il ne se passe rien du tout ...

Voici mon bout de code pour récapitulatif :

#!/bin/bash
shopt -s nullglob globstar; 

for f in "$1"/*+*; do
	sansPlus="${f//+/ }"; 
	mv "$f" "$sansPlus"; 
	mv "$sansPlus" "${sansPlus//LM*--original--}"; 
done

EDIT : Quand je commence ma boucle comme ceci, ils me remet les fichiers à la racine de mon répertoire :

for f in "$1"/**/*+*; do

Dernière modification par Terminus78 (Le 09/11/2021, à 14:34)

Hors ligne

#16 Le 09/11/2021, à 14:38

Watael

Re : [Résolu] Script parcours arborescence pour renommage

je montrais un exemple, vite fait, dans le répertoire courant uniquement.
bien sûr, si tu veux descendre dans les sous-répertoires, il faut remettre le double astérisque.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 09/11/2021, à 15:14

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Okok, mais du coup j'ai toujours le même soucis sad
A savoir que j'aimerais qu'il modifie les noms de mes fichiers sans avoir à les retrouver à la racine, mais bien à l'endroit où ils étaient de base...

Une idée pour ce problème ?

Hors ligne

#18 Le 09/11/2021, à 15:33

Watael

Re : [Résolu] Script parcours arborescence pour renommage

ça ne devrait pas faire ça : le second mv enlève seulement la partie LM...--original--

tu peux ajouter un echo devant les mv, et nous montrer la sortie, stp ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#19 Le 09/11/2021, à 15:57

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706561/LM706561--original--TV and Online Intelligence Database - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706595/LM706595--original--TV Media Intelligence Database - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711990/LM711990--original--World Television Information Service Forecasting Tool - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711991/LM711991--original--World Television Information Service Data Sheets - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM714536/LM714536--original--Home Entertainment Intelligence Database - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM714537/LM714537--original--Online Video Intelligence Database - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM714538/LM714538--original--TV and Online Video Analyst Handbook - November 2021.xlsx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM719281/LM719281--original--2022 Trends to Watch The Indian OTT and Pay-TV Market PDF.pdf
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM719281/LM719281--original--2022 Trends to Watch The Indian OTT and Pay-TV Market.pptx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM720472/LM720472--original--Enterprise Network Services Insights Survey 2021 PDF.pdf
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM720472/LM720472--original--Enterprise Network Services Insights Survey 2021.pptx
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM720567/LM720567--original--2022 Trends to Watch Broadband PDF.pdf
test
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM720567/LM720567--original--2022 Trends to Watch Broadband PPT.pptx

j'ai mis echo test et echo $sansPlus, juste avant les mv

Dernière modification par Terminus78 (Le 09/11/2021, à 15:58)

Hors ligne

#20 Le 09/11/2021, à 16:25

Watael

Re : [Résolu] Script parcours arborescence pour renommage

non, il faut qu'on voit les arguments que reçoit mv
j'ai dit "devant", pas "avant". smile

Dernière modification par Watael (Le 09/11/2021, à 16:26)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#21 Le 09/11/2021, à 16:34

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Ah ! Sorry. Juste devant les mv du coup ?
Comme ça ? :

for f in "$1"/*/*+*; do
	sansPlus="${f//+/ }"; 
	
	echo mv "$f" "$sansPlus"; 
	echo mv "$sansPlus" "${sansPlus//LM*--original--}"; 
done

Ca me donne ceci (extrait car c'est un peu long) :

mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706561/LM706561--original--TV+and+Online+Intelligence+Database+-+November+2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706561/LM706561--original--TV and Online Intelligence Database - November 2021.xlsx
mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706561/LM706561--original--TV and Online Intelligence Database - November 2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/TV and Online Intelligence Database - November 2021.xlsx
mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706595/LM706595--original--TV+Media+Intelligence+Database+-+November+2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706595/LM706595--original--TV Media Intelligence Database - November 2021.xlsx
mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM706595/LM706595--original--TV Media Intelligence Database - November 2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/TV Media Intelligence Database - November 2021.xlsx
mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711990/LM711990--original--World+Television+Information+Service+Forecasting+Tool+-+November+2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711990/LM711990--original--World Television Information Service Forecasting Tool - November 2021.xlsx
mv /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711990/LM711990--original--World Television Information Service Forecasting Tool - November 2021.xlsx /opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/World Television Information Service Forecasting Tool - November 2021.xlsx

Hors ligne

#22 Le 09/11/2021, à 16:43

Watael

Re : [Résolu] Script parcours arborescence pour renommage

ben ? c'est bon, non ?

/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/LM711990/LM711990--original--World Television Information Service Forecasting Tool - November 2021.xlsx
/opt/application/98cas1/G05R00C00/talend/consolidation/TEST/SendTest/2021_11_02-16h_19_test/World Television Information Service Forecasting Tool - November 2021.xlsx

qu'est-ce qui ne va pas ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#23 Le 10/11/2021, à 00:30

Terminus78

Re : [Résolu] Script parcours arborescence pour renommage

Bah enfaite, en même temps que le renommage, ça prend mes fichiers qui sont dans les sous-répertoires, et ça les remonte d'un cran, sous le répertoire d'origine. Alors que je souhaiterais qu'ils restent dans leurs dossiers respectifs.

Hors ligne

#24 Le 10/11/2021, à 02:39

Watael

Re : [Résolu] Script parcours arborescence pour renommage

j'ai compris : ça supprime l'expression depuis le premier LM jusqu'à --original-- dans la totalité de la variable, y compris le nom du répertoire.

comme je l'avais dit une solution serait d'isoler le nom du répertoire (jusqu'au dernier /) et le nom du fichier (à partir du dernier /), et de ne supprimer l'expression que dans le nom du fichier.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#25 Le 10/11/2021, à 02:49

MicP

Re : [Résolu] Script parcours arborescence pour renommage

Bonjour

Dans son message #23, Terminus78 a écrit :

…ça prend mes fichiers qui sont dans les sous-répertoires, et ça les remonte d'un cran, sous le répertoire d'origine. Alors que je souhaiterais qu'ils restent dans leurs dossiers respectifs.…

EDIT : Par défaut, l'option extglob est  activée,
sinon il faudra l'activer pour que le script fonctionne.

Essaye avec ça :

for f in "$1"/*/*+*; do

        chemin="${f%/*}"
        nomFich="${f##*/}"

        sansPlus="${nomFich//+/ }"
	sansLM="${sansPlus//LM+([[:digit:]])--original--}"

	echo mv "$f" "$chemin/$sansLM"
done

Edit : J'avais mal formulé l'assignation de la valeur à la variable nommée sansLM
C'est corrigé maintenant.

Dernière modification par MicP (Le 19/11/2021, à 13:39)

Hors ligne