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

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

Dark-Sham a écrit :

Pas testé, mais ça devrait être bon smile

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 wink; 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

abelthorne a écrit :

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

HP a écrit :

donc j'ignore si ça fait ce que l'on voudrait

C'est pas très encourageant, ça. wink

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
HP a écrit :

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. wink
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

abelthorne a écrit :

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 wink


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 wink ), 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. smile
Merci à tous.

Dernière modification par abelthorne (Le 04/11/2008, à 16:55)

Hors ligne