#1 Le 04/11/2008, à 13:11
- abelthorne
[résolu] Tester des noms de fichier en bash
Bonjour,
Je voudrais créer un petit script Nautilus pour trier des icônes dans un dossier. Dans celui-ci, j'ai des fichiers PNG et SVG et je voudrais supprimer les doublons PNG si le SVG du même nom existe.
Mais je ne sais pas (plus) comment récupérer/tester le nom de fichier, sans l'extension, pour faire mon script :
Pour chaque fichier en .svg dans le dossier
Si le fichier existe en .png
effacer le .png
Un petit coup de main ?
Dernière modification par abelthorne (Le 04/11/2008, à 16:49)
Hors ligne
#2 Le 04/11/2008, à 13:16
- morphoneo69
Re : [résolu] Tester des noms de fichier en bash
Pour les test sur fichier : http://abs.traduc.org/abs-5.3-fr/ch07s02.html
Il faut avant remplacer l'extension svg en png et pour ça un petit sed mais je suis pas un spécialiste :x. (CA doit être un truc du genre sed s/svg/png/ )
Hors ligne
#3 Le 04/11/2008, à 13:30
- WW
Re : [résolu] Tester des noms de fichier en bash
Salut,
#/bin/sh
for i in *.svg do
rm ${i%.svg}.png
done
Quand on sait c'est facile, mais qui n'a jamais été débutant.
Hors ligne
#4 Le 04/11/2008, à 13:39
- abelthorne
Re : [résolu] Tester des noms de fichier en bash
Merci beaucoup. Mais une petite question quand même : si je comprends bien, le script va parcourir tous les .svg et effacer les .png correspondants. Ça ne va pas poser problème s'il n'y a pas de PNG (certaines icônes ne sont qu'en PNG, d'autres qu'en SVG et d'autres dans les deux formats) ? Est-ce qu'il ne faudrait pas tester si le fichier .png existe avant de tenter de l'effacer ?
Dernière modification par abelthorne (Le 04/11/2008, à 13:39)
Hors ligne
#5 Le 04/11/2008, à 15:02
- Dark-Sham
Re : [résolu] Tester des noms de fichier en bash
#/bin/bash
ls *.svg 2>&1 > /dev/null
test=$?
if $test
then
for i in *.svg do
rm ${i%.svg}.png
done
fi
Pas testé, mais ça devrait être bon
Dernière modification par Dark-Sham (Le 04/11/2008, à 15:02)
Script de sauvegarde/restauration APT
Ubuntu 8.04 "Hardy Heron"
CPU : AMD Athlon XP 2800+ ; GPU : ATI Radeon 9250/9200 Series ; RAM : 2 Gigots + 512 Mégots ; Carte mère : Asus A7N8X-E Deluxe
Hors ligne
#6 Le 04/11/2008, à 15:10
- abelthorne
Re : [résolu] Tester des noms de fichier en bash
Si je tape
ls *.svg 2>&1 > /dev/null
test=$?
dans un terminal, puis echo $test, j'obtiens "0" en retour. Pourtant il y a bien des fichiers SVG dans le dossier courant.
À moins que le test porte sur un code d'erreur plutôt qu'un true (1) / false (0) ?
Dernière modification par abelthorne (Le 04/11/2008, à 15:12)
Hors ligne
#7 Le 04/11/2008, à 16:00
- HP
Re : [résolu] Tester des noms de fichier en bash
Pas testé, mais ça devrait être bon
Pas testé, et ça se voit… et quant à être bon je doute…
$(ls *.svg >& /dev/null) && {
for i in *.svg; do
rm ${i%.svg}.png
done
}
un peu testé… pourrait être la version corrigée du précédent, donc j'ignore si ça fait ce que l'on voudrait ; mais au moins la syntaxe est correcte et plus concise…
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#8 Le 04/11/2008, à 16:02
- HP
Re : [résolu] Tester des noms de fichier en bash
echo $test, j'obtiens "0" en retour.
bé il faudrait un peu lire la doc les gaillards… ça aiderait !
0 est le code de sortie pour une commande qui s'est déroulée sans erreur… donc, tout ce qui est supérieur à 0 correspond à une erreur.
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#9 Le 04/11/2008, à 16:07
- abelthorne
Re : [résolu] Tester des noms de fichier en bash
donc j'ignore si ça fait ce que l'on voudrait
C'est pas très encourageant, ça.
Ce que je voudrais faire est expliqué dans le premier post. J'aurais juste besoin de deux infos :
- est-ce que le ${i%.svg} présent dans vos divers scripts signifie "i sans .svg" ? c'est le caractère % qui me perturbe
- dans la doc, j'ai vu qu'on pouvait tester l'existence d'un fichier avec le switch "-e" de if. Est-ce que ce qui suit serait correct syntaxiquement :
nom=${i%.svg}.png
if [ -e "$nom" ]; then
rm "$nom"
fi
0 est le code de sortie pour une commande qui s'est déroulée sans erreur… donc, tout ce qui est supérieur à 0 correspond à une erreur.
Je le note.
J'ai plus l'habitude d'avoir des codes de retour booléens, d'où mes interrogations.
Dernière modification par abelthorne (Le 04/11/2008, à 16:10)
Hors ligne
#10 Le 04/11/2008, à 16:13
- HP
Re : [résolu] Tester des noms de fichier en bash
Est-ce que ce qui suit serait correct syntaxiquement :
nom=${i%.svg}.png if [ -e "$nom" ]; then rm "$nom" fi
Déjà la syntaxe de ton test est dépréciée… la syntaxe est un peu lourde si ce n'est que pour faire un rm…
j'ai assez horreur des if […] fi… je préfère les accolades là où c'est possible…
Sinon, ça semble correct.
Je me répète, lisez la doc… c'est surtout comme ça qu'on progresse… et non en copiant/collant une grosse partie des idioties vues sur les forums…
Dernière modification par HP (Le 04/11/2008, à 16:14)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#11 Le 04/11/2008, à 16:16
- abelthorne
Re : [résolu] Tester des noms de fichier en bash
Justement, c'est la syntaxe utilisée dans la doc (du présent site). Je ne savais pas qu'on pouvait mettre des accolades.
Où puis-je trouver une doc correcte (mes années de scripts bash remontent à loin) ?
Dernière modification par abelthorne (Le 04/11/2008, à 16:33)
Hors ligne
#12 Le 04/11/2008, à 16:28
- HP
Re : [résolu] Tester des noms de fichier en bash
http://bash-hackers.org/wiki/
ici, en anglais… mais au moins, c'est up-to-date …
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#13 Le 04/11/2008, à 16:33
- abelthorne
Re : [résolu] Tester des noms de fichier en bash
Merci pour le lien.
Bon, le script marche à un détail près. Qui doit être lié au fait que j'avais oublié de préciser quelque chose : le but est de faire un script Nautilus. Pour l'instant, il fonctionne sur tout le dossier, indépendamment des fichiers sélectionnés. Si je m'en réfère aux scripts qu'on m'avait (largement) aidé à faire (pour ne pas dire fait à ma place ), on traite les fichiers sélectionnés avec "$@". Est-ce qu'on peut ne traiter que les fichiers .svg parmi ceux sélectionnés ? J'ai fait des essais du style "$@.svg", "$@".svg et "${@.svg}" sans succès.
EDIT : je n'avais pas vu la page de la doc sur "nautilus scripts". Apparemment, utiliser $@ n'est pas non plus une bonne méthode.
EDIT : bon, finalement mon script marche. Il ressemble à une usine à gaz, mais ça suffira pour ce que j'ai à faire.
Merci à tous.
Dernière modification par abelthorne (Le 04/11/2008, à 16:55)
Hors ligne