#1 Le 12/06/2012, à 16:41
- Hizoka
[resolu] Simplification d'un code bash
Bonjour,
je voulais savoir s'il était possible de regrouper ces 2 commandes :
# Recherche de fichiers
while read
do
echo "Fichier trouvé : ${REPLY}"
done < <(find /home/hizoka -type f -regex ".*\.[0-9]$")
# Message indiquant qu'il n'y a pas eu de fichier de trouvé
[[ -z $(find "${man}" -type f -regex ".*\.[0-9]$") ]] && echo "Aucun fichier de trouvé"
ce n'est pas grand chose, mais si y a moyen d'eviter de faire 2 recherches.
Bon je viens de voir qu'on peut simplement verifier si la variable REPLY est vide
REPLY=fichier
echo ${REPLY}
=> fichier
while read
do
echo "Fichier trouvé : ${REPLY}"
done < <(find /home/hizoka -type f -regex ".*\.[0-9]$")
[[ -z ${REPLY} ]] && echo "Aucun fichier de trouvé"
=> "Aucun fichier de trouvé"
mais du coup je pose quand même la question, est-il possible de relier les 2 commandes du style :
while read
do
echo "Fichier trouvé : ${REPLY}"
done < <(find /home/hizoka -type f -regex ".*\.[0-9]$") || echo "Aucun fichier de trouvé"
Meme si je sais bien que cette commande n'est pas valable.
Merci à vous !
Dernière modification par Hizoka (Le 12/06/2012, à 22:35)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 12/06/2012, à 19:23
- Postmortem
Re : [resolu] Simplification d'un code bash
Salut,
Je ne sais pas si on va pouvoir appeler ça une simplification...
i=0
while read
do
((i++))
echo "Fichier trouvé : ${REPLY}"
done < <(find . -type f -regex ".*\.t[0-9]$") && { ((i)) || echo "Aucun fichier de trouvé";}
Edit : petite modif
Re-edit : modif annulée !
Je suis pas sûr que ça soit bien terrible mon truc !!
Dernière modification par Postmortem (Le 12/06/2012, à 19:29)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 12/06/2012, à 22:06
- Totor
Re : [resolu] Simplification d'un code bash
bonsoir,
shopt -s nullglob globstar
fichiers=( ~/**/*.[0-9] )
[[ "${fichiers[@]}" ]] && printf "Fichier trouvé : %s\n" "${fichiers[@]}" || echo "Aucun fichier"
-- Lucid Lynx --
Hors ligne
#4 Le 12/06/2012, à 22:35
- Hizoka
Re : [resolu] Simplification d'un code bash
toujours aussi baleze le totor...
Merci à toi !
Postmortem, en effet pas super plus simple ton truc
Totor :
shopt -s nullglob globstar
ca veut dire quoi en fait ?
Dernière modification par Hizoka (Le 12/06/2012, à 22:40)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 13/06/2012, à 12:37
- Totor
Re : [resolu] Simplification d'un code bash
ça permet d'activer les options de shell nullglob et globstar
nullglob : l'expansion de nom de fichiers renvoie null si aucun fichier ne correspond au pattern
globstar : l'utilisation de ** permet l'expansion de nom de fichiers récursive (dossier et sous-dossiers)
Dernière modification par Totor (Le 13/06/2012, à 12:38)
-- Lucid Lynx --
Hors ligne
#6 Le 14/06/2012, à 18:57
- Hizoka
Re : [resolu] Simplification d'un code bash
Quelques retours :
Quelque soit le résultat du while, REPLY est vide apres la boucle, on ne peut donc se baser sur cette variable comme je l'indiquais.
Ton exemple fonctionne bien mais n'est pas pratique dans mon cas actuel car mon find :
find "${usr}" -depth -type f ! -regex ".*~$" ! -iname "*.pyc" ! -empty
ce que ne permet pas ta recherche de fichier, a moins d'ajouter de nombreuses verifications...
une autre idée ?
Actuellement je suis plus sur :
liste_install=$(find "${usr}" -depth -type f ! -regex ".*~$" ! -iname "*.pyc" ! -empty | sed "s@${projet}/@@")
while read
do
echo "Fichier trouvé : ${REPLY}"
done <<< "${liste_install}"
# Message d'erreur sur l'abscence de fichier
[[ -z ${liste_install} ]] && echo "Aucun fichier"
unset liste_install
ca n'a pas diminué le code mais au moins j'evite d'executer 2 fois le find...
Dernière modification par Hizoka (Le 14/06/2012, à 18:57)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 16/06/2012, à 14:31
- Totor
Re : [resolu] Simplification d'un code bash
Désolé, je n'avais pas vu ta demande :
le pb, c'est que l'on ne peut pas filtrer sur la taille et le type de fichier en bash... il faut obligatoire réaliser ces tests par ailleurs (ou feinter pour les dossiers)
1/
shopt -s nullglob globstar
GLOBIGNORE="*~:*.pyc"
unset fichiers
for fichier in **
do
[ -f "${fichier}" ] && [ -s "${fichier}" ] && fichiers+=( "${fichier}" )
done
[[ "${fichiers[@]}" ]] && printf "Fichier trouvé : %s\n" "${fichiers[@]}" || echo "Aucun fichier !"
2/
shopt -s nullglob globstar extglob
unset fichiers
for fichier in **/!(*~|*.pyc)
do
[ -f "${fichier}" ] && [ -s "${fichier}" ] && fichiers+=( "${fichier}" )
done
[[ "${fichiers[@]}" ]] && printf "Fichier trouvé : %s\n" "${fichiers[@]}" || echo "Aucun fichier !"
Pour feinter les dossiers :
shopt -s globstar nullglob
# affichage de tous les fichiers ET dossiers
printf "%s\n" **
# affichage de tous les fichiers SANS les dossiers
GLOBIGNORE="$(printf "%s:" **/)"
GLOBIGNORE="${GLOBIGNORE//\/:/:}"
printf "%s\n" **
Dernière modification par Totor (Le 16/06/2012, à 14:33)
-- Lucid Lynx --
Hors ligne
#8 Le 16/06/2012, à 16:12
- Hizoka
Re : [resolu] Simplification d'un code bash
merci pour tes retours
je vais tester et choisir ce que je prefere
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne