#1 Le 22/07/2022, à 17:42
- Artwork
[RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Bonjour,
Depuis peu, j'ai basculé sur zsh.
Avec bash, je renommais des fichiers dans le dossier courant si les noms correspondaient à ceux lister dans un fichier.
Voilà la commande :
find $(<~/listing.xml) -name "*.webp" -exec sh -c 'mv "$1" "${1%.webp}.webp.nouveau"' _ {} \;
Donc les fichiers qui ont un nom identique à ceux listés dans le fichier listing.xml sont renommés de .webp à .webp.nouveau
Voilà le contenu du fichier listing.xml :
~/Téléchargements/test ▓▒░ ░▒▓ ✔ │ arnaud@L340
╰─ cat listing.xml
1.*
2.*
3.*
4.*% ╭─ ~/Téléchargements/test
Je mets une étoile après le point car je teste sur plusieurs extensions de fichiers.
Avec bash, tout roule donc mais avec zsh, rien se passe et j'ai un message d'erreur pour chaque fichier de listing.xml :
find: ‘1.*’: No such file or directory
Je ne comprends pas vraiment pourquoi ça coince.
Merci d'avance pour votre aide.
Dernière modification par Artwork (Le 12/08/2022, à 10:45)
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#2 Le 22/07/2022, à 18:09
- FrancisFDZ
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Bonjour,
Dans la commande
find $(<~/listing.xml) -name "*.webp" -exec sh -c 'mv "$1" "${1%.webp}.webp.nouveau"' _ {} \;
le shell utilisé n'est ni "bash" ni "zsh", mais simplement "sh". Du coup, que la commande soit lancée par bash ou zsh ne devrait rien changer.
Je ne comprends pas vraiment pourquoi ça coince.
Ben moi non plus !
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#3 Le 22/07/2022, à 18:57
- Watael
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
si, si, FrancisFDZ, $(<~/listing.xml) c'est du bash, que comprend zsh (ou le contraire, je ne connais pas suffisamment zsh), mais pas les shells moins évolué comme dash.
mais, Arrtwork, question sans rapport avec le problème : pourquoi nommer un fichier ".xml" alors que ce fichier ne contient pas du XML ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 23/07/2022, à 08:31
- FrancisFDZ
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
@Watael : merci de la correction, pour un novice en shell (moi en l’occurrence) ce n'est pas évident. Cependant, dans la commande proprement dite, il n'est question que de "sh" !
Dernière modification par FrancisFDZ (Le 23/07/2022, à 08:49)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#5 Le 23/07/2022, à 09:05
- FrancisFDZ
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Je reprend: si j'ai bien compris, "$(<~/listing.xml)" est une "regexp" typique de bash, que zsh sait saurait interpréter.
Le message d'erreur
find: ‘1.*’: No such file or directory
concerne la désignation du répertoire source de la recherche, soit "$(<~/listing.xml)" et c'est bien cette expression qui est mal interprétée et justifie le message d'erreur. Du coup je ne suis pas si sur que zsh interprète correctement cette expression, AMHA c'est sur cette expression qu'il faut chercher l'erreur (du point de vue de zsh)
Dernière modification par FrancisFDZ (Le 23/07/2022, à 17:17)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#6 Le 23/07/2022, à 09:31
- Tawal
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Hello,
Pour info, $(<~/listing.xml) n'est pas une regex, mais une substitution de commande ne comprenant qu'une redirection.
Je ne connais pas du tout zsh, mais il faut peut être chercher de ce coté là.
Mais je me dis que la substitution remplace par le mot litéral 1.* avec zsh et que * n'est pas interprété comme un glob.
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
#7 Le 23/07/2022, à 10:11
- FrancisFDZ
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Autrement dit "$(<~/listing.xml)" a été traduit pas zsh en "‘1.*’", pour contourner le problème il faudrait remplacer l'expression originale par un équivalent assimilable par zsh.
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#8 Le 23/07/2022, à 12:11
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Le fichier listing porte l'extension XML car tous mes fichiers sont en XML :-)
Merci pour vos retours. Je continuerai mes recherches cet aprem.
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#9 Le 23/07/2022, à 14:19
- Watael
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
alors, ça devrait être listing_xml, ou xml.list. ainsi, on comprend que le fichier n'est pas au format XML.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 08/08/2022, à 10:21
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Bonjour,
Après plusieurs jours de recherches et tests, je suis finalement parti sur l'exécution de scripts avec le shebang bash mais lancés depuis un shell ZSH. Enfin, si j'arrive à mes fins ?
Je suis confronté à une nouvelle difficulté...
J'ai créé un script.sh de ce style :
#!/bin/bash
cd /home/...Dossier_A/Images
find $(</home/....Dossier_B/listing.txt) -name "*.webp" -exec sh -c 'echo mv "$1" "${1%.webp}.webp.temporaire"' _ {} \;
Si j'ouvre un shell pour exécuter le script.sh, ça fonctionne. Seuls les fichiers listés dans listing.txt seront renommés
Cependant, si je lance ce script depuis un autre emplacement que là où il est présent alors le fichier listing.txt n'est PAS pris en compte : tous les fichiers webp de Dossier_B sont renommés.
=> Pourquoi ?
Merci.
Dernière modification par Artwork (Le 08/08/2022, à 10:28)
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#11 Le 08/08/2022, à 10:32
- MicP
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Bonjour
Dans la ligne de commande associée à ton alias,
plutôt que de lancer un script bash avec un l'interpréteur de commandes /usr/bin/dash (le fichier /usr/bin/sh est un lien vers l'exécutable /usr/bin/dash)
lance ton script avec l'interpréteur bash
alias tmp='bash /home/.../script.sh'
=======
Pour nommer ton alias, tu devrais choisir un autre nom que celui du répertoire /tmp/
Dernière modification par MicP (Le 08/08/2022, à 10:35)
Hors ligne
#12 Le 08/08/2022, à 10:37
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Oui, l'alias tmp c'était pour la démo
Alors j'ai testé et l'alias fonctionne bien si je le lance depuis le répertoire où est contenu le script mais pas si je lance depuis ~ par exemple.
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#13 Le 08/08/2022, à 10:53
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Plus précisément, voilà les fichiers :
arnaud@L340:~/Tmp$ cat script_ok.sh
#!/bin/bash
cd test
find $(</home/arnaud/Tmp/test/listing.txt) -name "*.webp" -exec sh -c 'echo mv "$1" "${1%.webp}.webp.new"' _ {} \;
arnaud@L340:~/Tmp$ cat test/listing.txt
disney_.*
story_downloader.*
whatsapp.*
arnaud@L340:~/Tmp$ ls test
_1_and_1_tv.webp _1tap_cleaner_pro.webp disney_.webp listing.txt pdf_editor.webp script.sh whatsapp.png
arnaud@L340:~/Tmp$
Exécution depuis le répertoire où est stocké le script :
arnaud@L340:~/Tmp$ ./script_ok.sh
mv disney_.webp disney_.webp.new
find: ‘story_downloader.*’: No such file or directory
arnaud@L340:~/Tmp$
=> OK
Exécution depuis le dossier parent
arnaud@L340:~/Tmp$ cd ..
arnaud@L340:~$ bash Tmp/script_ok.sh
Tmp/script_ok.sh: line 2: cd: test: No such file or directory
find: ‘disney_.*’: No such file or directory
find: ‘story_downloader.*’: No such file or directory
find: ‘whatsapp.*’: No such file or directory
arnaud@L340:~$
Dernière modification par Artwork (Le 08/08/2022, à 10:53)
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#14 Le 08/08/2022, à 11:02
- iznobe
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Bonjour , ca ne serait pas simplement a cause de :
#!/bin/bash
cd test
find ....
tu chznges de repertoire dans ton script avant de faire le find ...
d' ailleurs il te le dit dans la reponse en + :
Tmp/script_ok.sh: line 2: cd: test: No such file or directory
un cd est relatif au dossier de depart , donc des que tu changes de repertoire de lancement , plus de dossier test dans ton repertoire de lancement .
ce qui veut dire : n ' utilise pas cd dans un script ! uniquement des chemins absolus
Dernière modification par iznobe (Le 08/08/2022, à 11:06)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#15 Le 08/08/2022, à 13:24
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
J'avoue que ça m'arrangerait sauf que je n'y arrive pas.
J'ai testé :
find /home/arnaud/Tmp/test/ $(<listing.txt) -name "*.webp" -exec sh -c 'echo mv "$1" "${1%.webp}.webp.new"' _ {} \;
mais ça ne prend plus en compte la liste dans listing.txt
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#16 Le 08/08/2022, à 13:29
- MicP
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
…un cd est relatif au dossier de depart …
Dison plutôt que si l'on donne à la commande cd un chemin relatif, elle cherchera à aller dans ce chemin relatif,
et si on lui donne un chemin absolu, elle cherchera à aller dans ce chemin absolu,
mais dans les deux cas, si on lui donne en paramètre un chemin (absolu ou relatif) qui n'existe pas, alors il est logique qu'elle ne puisse y aller.
Mais de toutes façons, faire un cd dans un script, c'est une source de problèmes à venir (=> qui finiront par se manifester un jour où l'autre, et en tenant compte de la loi de Murphy ce sera forcement le jour où il fallait vraiment pas que ça arrive),
Dernière modification par MicP (Le 08/08/2022, à 13:33)
Hors ligne
#17 Le 08/08/2022, à 13:32
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Le cd mal placé, c'est une erreur dans le cas de test
Pas mieux avec ta suggestion @iznobe. Le script ne fait rien pour le coup.
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#18 Le 08/08/2022, à 14:25
- iznobe
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
J'ai testé :
find /home/arnaud/Tmp/test/ $(<listing.txt) -name "*.webp" -exec sh -c 'echo mv "$1" "${1%.webp}.webp.new"' _ {} \;
mais ça ne prend plus en compte la liste dans listing.txt
il n ' y a pas un espace en trop avant : $(<listing.txt)
Dernière modification par iznobe (Le 08/08/2022, à 14:25)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#19 Le 08/08/2022, à 14:42
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Il y avait effectivement un espace et ça fonctionne mieux. Vu qu'il ne trouve pas certains fichiers, j'ai l'impression qu'il s'arrête.
Voilà le contenu du script :
#!/bin/bash
find /home/arnaud/Tmp/test/$(</home/arnaud/Tmp/test/listing.txt) -name "*.webp" -exec sh -c 'mv "$1" "${1%.webp}.webp.temporaire"' _ {} \;
find /home/arnaud/Tmp/test/$(</home/arnaud/Tmp/test/listing.txt) -name "*.png" -exec sh -c 'mv "$1" "${1%.png}.png.temporaire"' _ {} \;
Résultat :
~/Tmp ▓▒░ ./script_ok.sh ░▒▓ ✔
find: ‘story_downloader.*’: No such file or directory
find: ‘whatsapp.*’: No such file or directory
find: ‘story_downloader.*’: No such file or directory
find: ‘whatsapp.*’: No such file or directory
~/Tmp ▓▒░ ░▒▓ 1 ✘
~/Tmp ▓▒░ ls test ░▒▓ ✔
_1_and_1_tv.webp _1tap_cleaner_pro.webp disney_.webp.temporaire listing.txt pdf_editor.webp whatsapp.png
~/Tmp ▓▒░
Les fichiers webp ont bien été renommés (cool) mais pas les png, enfin whatsapp.png plus exactement.
Dans les scripts, une nouvelle ligne correspond à && et pas ; c'est ça ?
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#20 Le 08/08/2022, à 14:49
- iznobe
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Dans les scripts, une nouvelle ligne correspond à && et pas ; c'est ça ?
le " && " enchaine la 2eme commande si la 1ere ne renvoie pas d' erreur .
le " ; " distingue les 2 commandes , c ' est a dire executera les 2 commandes peu importe le resultat de la 1ere .
je ne sais pas trop ce que tu entends par " nouvelle ligne " et pas sur que ma réponse corresponde a ta question .
En relisant je trouve plus claire la question .
Donc on peut mettre un " ; " pour eviter d ' aller a la ligne lorsqu ' on ecrit plusieurs commandes .
mais on est pas obligé de mettre un " ; " pour commencer une nouvelle ligne .
exemple ( pas beau mais possible ) :
find /home/arnaud/Tmp/test/$(</home/arnaud/Tmp/test/listing.txt) -name "*.webp" -exec sh -c 'mv "$1" "${1%.webp}.webp.temporaire"' _ {} \; find /home/arnaud/Tmp/test/$(</home/arnaud/Tmp/test/listing.txt) -name "*.png" -exec sh -c 'mv "$1" "${1%.png}.png.temporaire"' _ {} \
echo "un truc"
Dernière modification par iznobe (Le 08/08/2022, à 14:55)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#21 Le 08/08/2022, à 15:42
- Watael
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
c'est pas beau, et ça va à l'encontre des "bonnes pratiques" qui recommandent, pour une meilleure lisibilité, qu'une ligne de code ne dépasse pas les 80 caractères.
pourquoi ${1%.png}, si c'est pour remettre la même extension derrière ?
Dernière modification par Watael (Le 08/08/2022, à 15:53)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 08/08/2022, à 15:50
- iznobe
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
pourquoi ${1%.png}, si c'est pour remettre la même extension derrière ?
@Watael , bien vu !
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#23 Le 12/08/2022, à 07:11
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Donc, dans un script, les commandes s'enchaînent obligatoirement. On ne peut pas mettre de dépendance comme avec le &&
En tout cas, le problème reste entier. Les PNG ne sont pas renommés... alors que c'est la même commande.
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#24 Le 12/08/2022, à 07:33
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
pourquoi ${1%.png}, si c'est pour remettre la même extension derrière ?
Si je remplace
find /home/arnaud/Documents/test/$(</home/arnaud/Documents/test/listing.txt) -name "*.webp" -exec sh -c 'mv "$1" "${1%.webp}.webp.temporaire"' _ {} \;
par
find /home/arnaud/Documents/test/$(</home/arnaud/Documents/test/listing.txt) -name "*.webp" -exec sh -c 'mv "$1" "${1%}.webp.temporaire"' _ {} \;
Le fichier est renommé en "nom.webp.webp.temporaire"
Dernière modification par Artwork (Le 12/08/2022, à 07:33)
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne
#25 Le 12/08/2022, à 08:24
- Artwork
Re : [RESOLU] [ZSH vs BASH] Renommer des fichiers selon listing
Rectification, ce n'est que ça marche qu'avec les webp, c'est que ça marche qu'une seule fois. disney_.* est le premier fichier qui marche dans le fichier listing.txt.
Si je mets whatsapp.* tout haut alors il est renommé et pas le reste.
KDE neon user 20.04
Lenovo IdeaPad L340-15IRH Gaming
Mesa Intel UHD Graphics 630 / NVIDIA GP107M [GeForce GTX 1050 3 GB Max-Q]
8 x Intel Core i5-9300H
Hors ligne