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 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 !! roll

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 tongue

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

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 smile

je vais tester et choisir ce que je prefere smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne