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 11/03/2014, à 13:44

cristobal78

(résolu) Empêcher l'affichage de messages d'erreur dans la console

Bonjour à tous

J' essaie de mettre au point un script qui change d'un coup toutes les dates des fichier d'un répertoire donné, ici nommé "rep".
Dans ce script je dois m'assurer au préalable qu'aucun des noms de fichiers du répertoire "rep" ne contient de blancs (sinon ça fout la m...).
Donc j'ai inséré les lignes suivantes :

cd $rep
ls -1B *\ *				# (1) : crée une liste avec les noms de fichiers en "pile" #  *\ * : affiche les fichiers qui contiennent des blancs #  (B)  : n'affiche pas les fichiers qui se terminent par ~

code=$?
if [[ $code -eq 0 ]] ; then zenity --info  --width=400  --text="Warning : FICHIERS CONTENANT DES BLANCS\n Fin du programme"; exit ; fi

Ok, ça marche.

Le pb c'est que si aucun fichier ne contient de blanc il apparaît dans ma console le message suivant :

ls: impossible d'accéder à * *: Aucun fichier ou dossier de ce type

ce qui est normal mais je voudrais trouver un moyen pour que ce message d’erreur (inutile en l’occurrence) ne s'affiche pas dans la console.

Est ce possible ?
J'ai essayé des > /dev/null et d'autres mais sans succès.

Dernière modification par cristobal78 (Le 11/03/2014, à 18:03)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#2 Le 11/03/2014, à 13:48

serged

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

La méthode bourrin pour ne pas afficher les messages d'erreur :

ma_commande 2>/dev/null

Utile souvent quand on cherche un fichier à partir d'un répertoire système. Par exemple :

find /etc -iname "*apache*" 2>/dev/null

(évite les messages du genre "accès répertoire interdit")


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#3 Le 11/03/2014, à 18:01

cristobal78

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

Merci serged de ta rapide réponse.

Je n'étais pas loin de la solution : j'avais simplement oublié le "2>" devant le  "/dev/null"

J'en ai profité pour regarder ton blog smile et j'ai pu constaté que nous avons bcp de choses en commun à part le fait que je préfère de loin le classique (au jazz, etc..) et que je suis plutôt pronucléaire, et ... que j'ai 8 ans de plus sad

Je passe en "résolu".


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#4 Le 11/03/2014, à 21:52

Postmortem

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

Salut,
Sinon, tu peux nous montrer ton script afin qu'on t'explique comment traiter correctement les noms de fichiers, qu'il y ait des blancs ou n'importe quoi d'autre.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 12/03/2014, à 01:31

cristobal78

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

@ postmortem

Voilà à quoi ça ressemble.
Peut être pas "beau" mais ça marche impec et ça me fait gagner un temps fou pour re-dater une pile de photos !

#!/bin/bash
# nom du script = change-date-rep
# Fonction du script = modifier les dates des fichiers d'un répertoire donné
# Syntaxe = change-date-rep
# Note = jc-2014-03-11
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# sélection du rep contenant les fichiers dont on veut modifier la date de création
rep=$(zenity  --file-selection --directory --width=300 --height=200 --title="sélection du rep contenant les fichiers dont on veut modifier la date de création" ) 

# on se place dans le rép choisi et on vérifie l'absence de nom de fichiers avec des blancs
cd $rep
ls -1B *\ * 2>/dev/null				# (1) : fait une liste avec les noms de fichiers en "pile" pour meilleure lisibilté des fichiers à traiter
								# (B) et (*\ *) : n'affiche ni ceux qui se terminent par ~  ni ceux qui ne contiennent pas de blancs 
								# 2>/dev/null pour éviter le message d'erreur si pas de fichiers trouvés
code=$?
if [[ $code -eq 0 ]] ; then zenity --info  --width=500  --text="* * *  Attention * * *\n\nLe répertoire \n$rep \ncontient des fichiers dont les noms comportent des blancs\n\n Fin du programme"; exit ; fi

# saisie de la nouvelle date 
newdate=$(zenity  --width=600 --height=200 --title=" " --entry --text "Entrer la nouvelle date de création \npour les fichiers du répertoire $rep\n avec la date de référence au format : yyyy-mm-dd")

# modif de la date des fichiers de "rep"
for fic in $rep/*
do
	touch --date $newdate $fic
								# touch --date $newdate "`echo $fic`" pour éviter les blancs ?
done
exit

Dernière modification par cristobal78 (Le 12/03/2014, à 01:33)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#6 Le 12/03/2014, à 08:43

Postmortem

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

Tu n'étais pas loin, ta boucle en elle-même est correcte !
Il te manque seulement des guillemets.
Du coup, ton script deviendrait ça :

#!/bin/bash
# nom du script = change-date-rep
# Fonction du script = modifier les dates des fichiers d'un répertoire donné
# Syntaxe = change-date-rep
# Note = jc-2014-03-11
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# sélection du rep contenant les fichiers dont on veut modifier la date de création
rep=$(zenity  --file-selection --directory --width=300 --height=200 --title="sélection du rep contenant les fichiers dont on veut modifier la date de création" ) 

# saisie de la nouvelle date 
newdate=$(zenity  --width=600 --height=200 --title=" " --entry --text "Entrer la nouvelle date de création \npour les fichiers du répertoire $rep\n avec la date de référence au format : yyyy-mm-dd")

# modif de la date des fichiers de "rep"
for fic in "$rep"/*
do
	touch --date "$newdate" "$fic"
done
exit

Quand le contenu d'une variable est susceptible de contenir des caractères spéciaux, il faut mettre des guillemets autour. Ici, si un fichier contient une espace, le fait d'utiliser "$fic" fera que l'espace sera une simple espace typographique et non pas un caractère de séparation pour bash.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 12/03/2014, à 10:18

cristobal78

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

Salut postmortem

Merci pour tes modif.

Pour mieux comprendre ce que je cherche à faire il faut savoir que les fichiers en question n'étant pas à moi et récupérés sur USB  ceux-ci ont parfois des blancs dans leur nom.
Ces fichiers je les range dans mes répertoires qui eux sont créés par moi et ne contiennent jamais de blancs dans leur nom.

- Je vais donc suivre ta recommandation pour les fichiers et changer  $fic en "$fic".
- Comme mes noms de répertoires ne contiennent jamais de blancs "$rep" ne serait normalement pas nécessaire.
- En revanche pourquoi proposes tu des "" pour encadrer la variable $newdate ?
J'ai lu dans le man qu'il fallait l'écrire sous la forme yyyy-mm-dd il suffit donc de saisir la donnée dans la boite de dialogue correctement selon le bon format. Si on écrit mal la date la commande touch plante de toute façon.


Cela dit comme tu as pu le voir j'ai réglé (lourdingue, je sais !) le pb des blancs avec une ligne de commande dans chang-date-rep qui me permet de sortir du programme s'il  constate qu'au moins un nom de fichier contient des blancs.
Dès le constat fait je stoppe l'exécution de change-date-rep.
Et là j'utilise un autre script de mon cru (appelé supblanc) qui supprime les blancs (ou les remplace par "_", au choix  smile de tous les fichiers d'un répertoire donné.
Une fois cela fait je relance mon script change-date-rep smile
Fini.

A chaque fois que je peux, c'est à dire quand le pb à résoudre reste à ma portée, j'essaie tjrs de me faire un script à moi plutôt que d'aller chercher ici ou là des appli toutes faites. C'est plus marrant et plus enrichissant. Plus dur aussi, mais c'est là que c'est marrant.

Dernière modification par cristobal78 (Le 12/03/2014, à 10:18)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#8 Le 12/03/2014, à 12:11

Postmortem

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

cristobal78 a écrit :

- Comme mes noms de répertoires ne contiennent jamais de blancs "$rep" ne serait normalement pas nécessaire.

Mais si un jour tu as un répertoire avec espace, au moins, ça sera pris en compte. Perso, pour les variables contenant des chemins, j'en mets toujours.

cristobal78 a écrit :

- En revanche pourquoi proposes tu des "" pour encadrer la variable $newdate

Dans la commande touch --date ...., l'option --date attend un paramètre. Admettons que l'utilisateur rentre un mauvais format de date et que ce format contient une espace (admettons qu'il rentre : 2014- 03-11)
Si tu fais :

touch --date "$newdate" "$fic"

La commande exécutée sera :

touch --date "2014- 03-11" "$fic"

Cette commande fonctionne ; au pire, si le format de date rentré par l'utilisateur est complètement erroné, tu auras une erreur sur le format de la date.
Si tu fais :

touch --date $newdate "$fic"

La commande exécutée sera :

touch --date 2014- 03-11 "$fic"

Dans ce cas, c'est différent ; l'option --date reçoit comme paramètre 2014- seulement. 03-11 est considéré comme un nom de fichier au même titre que $fic et donc, tu te retrouves avec un fichier 03-11 créé.
Quand on veut qu'une variable soit prise comme un seul mot par le shell, quelque soit son contenu, il faut utiliser des guillemets.

Puis le système de fichier autorisant les blancs dans les noms de fichier, je trouve couillon qu'un script plante à cause de ça. Et souvent, ce n'est pas compliqué de les gérer, il suffit de faire attention au développement des variables (et d'utiliser plus de guillemets ! smile )


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 12/03/2014, à 13:51

cristobal78

Re : (résolu) Empêcher l'affichage de messages d'erreur dans la console

Merci de ces précisions. Je les enregistre et les mettrai à profit

1) en vérifiant tous mes scripts existants
2) pour mes scripts futurs.

PS
----
j'avais constaté la création de fichiers à 0 octets à cause des blancs comme dans ton exemple :

"....et donc, tu te retrouves avec un fichier 03-11 créé...."

Ici le fichier stupide 03-11 est créé et fait 0 octets.

Dernière modification par cristobal78 (Le 12/03/2014, à 13:52)


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne