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 28/08/2017, à 09:39

bravorienaredire

[Résolu]expressions rationnelles dans un "if"

Bonjour,

Je n'arrive pas exactement à définir ce qui ne va pas.
Ce que je sais, c'est que mon script marchait il y a quelques temps, et qu'il ne marche plus maintenant.
par exemple la ligne :

if [ -e "a0.*[0-99]\.txt" ] || [ -e "xsane_0.*[0-99]\.txt" ]; then

Ne fonctionne plus.
Même ça, ne marche pas:

if [ -e 'a0008\.txt' ]; then

La seul chose qui est acceptée, c'est ça :

if [ -e 'a0008.txt' ]; then

Bref, les expressions régulières ne semblent plus fonctionner.
Sauf que ( pour "if' "vrai") ;

find $source -maxdepth 1 -regex ~/"a0.*[0-99]\.txt" -print 2>/dev/null -exec mv {} $dest_xsane \;

Marche, lui.

Merci.

Dernière modification par bravorienaredire (Le 31/08/2017, à 12:50)

Hors ligne

#2 Le 28/08/2017, à 10:26

pingouinux

Re : [Résolu]expressions rationnelles dans un "if"

Bonjour,
Il ne s'agit pas ici d'expressions rationnelles, mais de "Pathname Expansion" (voir cette rubrique dans man bash).
Ceci pourrait marcher, si un seul fichier correspond :

if [ -e a0*[0-9].txt ]; then

Hors ligne

#3 Le 28/08/2017, à 13:21

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Merci de m'avoir répondu rapidement.

Il ne s'agit pas ici d'expressions rationnelles, mais de "Pathname Expansion" (voir cette rubrique dans man bash).

Ha ? Ha bon...

Ceci pourrait marcher, si un seul fichier correspond :

C'est déroutant, mais toutes les versions, même la plus complexes, marchaient, il me semble.
Bizarre, mais admettons.

Alors, quand vous dites "si un seul fichier correspond", si ça me sort toute une liste, c'est mort ?

Ça expliquerait pourquoi le code suivant fonctionne :

if [ -e 'a0008.txt' ]; then

Votre code ne marche pas, parce que il en "trouve" tout un tas, il doit être plus précis.

Donc, le pathname Expension, doit désigner un seul fichier, comme si on l'ouvrait dans un programme ?

Si je ne me trompe pas dans mon raisonnement, ça na va pas être pratique pour la suite.
Ce fichier n'est qu'un exemple, il peut y en avoir plusieurs, c'est pour faire un nettoyage/rangement dans mes fichiers.
donc, refaire le script.

Mon attention là-dessus, s'est relâché, je laisse la question ouverte.
Je verrais quand je reviendrais sur mon script.

Merci, pour cette cet éclair.

Dernière modification par bravorienaredire (Le 28/08/2017, à 17:21)

Hors ligne

#4 Le 28/08/2017, à 13:48

pingouinux

Re : [Résolu]expressions rationnelles dans un "if"

Pour tester si au moins un fichier existe, on peut utiliser cette méthode pas très propre :

shopt -s nullglob
if [ "$(echo a0*[0-9].txt)" ]; then

Le mieux me semble de faire une boucle sur les fichiers :

for fichier in a0*[0-9].txt; do
...
done

Hors ligne

#5 Le 28/08/2017, à 15:06

Watael

Re : [Résolu]expressions rationnelles dans un "if"

salut,

avec un tableau ?

shopt -s nullglob
ar=( a0*[0-9].txt )
(( ${#ar[*]} )) && echo "au moins un fichier" || echo "pas de fichier"

s'il y des fichiers, la liste est alors déjà disponible dans le tableau.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 28/08/2017, à 17:38

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Oui, je viens de voir, juste un forum, qui disait comme moi (ou comme vous pingouinux)
et qui proposait des codes comme ces deux exemples finaux.
Merci Watael et bonjour.
Je dois noter qu'il se trouve que, dans mon cas, les fichiers numérotés (aléatoirement en plus), c'est un exemple.
Il y a aussi des capture d'écran, des txts, etc.
Autrement dit, il y a banane, poire et carotte ;
et comment faire entrer ça dans un tableau ou une boucle...
Je devrais y arriver.
Mais je laisse ouvert, j'y proposerais le script final.
Merci à vous deux.

Hors ligne

#7 Le 28/08/2017, à 19:02

Watael

Re : [Résolu]expressions rationnelles dans un "if"

un tableau, c'est comme un cabas : tu y mets ce que tu ramènes du marché. wink

si tu veux séparer les légumes, les fruits, le poisson...
prends plusieurs cabas !
smile

Dernière modification par Watael (Le 28/08/2017, à 19:02)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 29/08/2017, à 17:52

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Watael, je sens que je vous ai lancé sur votre sujet préféré smile
Heu, je ne sais pas vraiment pourquoi je vous ai dit cela hmm
Bon, j'ai fait un script, mais sans internet, pendant un moment, cet après-midi, je n'avais pas pas la documentation nécessaire.
Alors, le code est vraiment bancal, ça ne marche pas tout à fait.
Je vais voir si je le poste demain.
au revoir donc.

Hors ligne

#9 Le 30/08/2017, à 10:12

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Bonjour,

Voici mon script à utiliser avec prudence, mais en principe, il marche, à condition de l'adapter à son contexte.
C'est une première version, stable. Personnellement, je vais le modifier, pour qu'il traite plusieurs types de fichiers, et plusieurs destinations.

Pour moi-même, il est au maximum commenté, mais il y des parties qui ne le sont pas, parce que j'enlève du commentaire aussi.
Selon moi, pour la clarté d'un script, il ne faut pas trop commenter, juste le code, mais c'est selon qui le regarde...

Bon, il y a des règles, que les pros du bash rappelleront ici, éventuellement.

Pour l'instant, j'aimerais savoir si, à ce stade, je mets le fil en [résolu] ou pas, s'il y a des questions ou des précisions, qu'on apporterait ?

Il est détaillé et progressif (c'est parfois mieux qu'un commentaire) comme cette partie :

# if [ $presence -eq 1 ]; then
# 	echo "Quelque chose"
# else
# 	echo "Rien"
# fi
#!/bin/bash

### Déplacement (non copie) de fichiers, 
### de ~ vers un dossier provisoire (donc en vue d'être libéré)...
### Une seule source, plusieurs destinations, selon la nature du fichier.


clear
source=/home/ericgb/

## Ajouter un ligne ici ##
dest_xsane=/home/ericgb/xsane_prov/

# Vérifier que les dossiers de destination existent,
# sinon les créer.

## Ajouter une ligne ici ##
if [ ! -d $dest_xsane ];then
  mkdir $dest_xsane;
fi

### Partie qui s'affiche

echo "Source :"
echo $source
echo
echo "Destination :"
echo dest_xsane=/home/ericgb/xsane_prov/
echo

shopt -s nullglob
ar=( a0*[0-9].txt )
echo ${ar[*]} # Affiche l'ensemble (le tableau) des fichiers trouvés.
(( ${#ar[*]} )) && presence=1 || presence=0
# echo $presence

# J'ai aissé cela, pour commenter : presence 1 il a au moins 1 fichier à déplacer ; 0 il n'y pas de fichier
# if [ $presence -eq 1 ]; then
# 	echo "Quelque chose"
# else
# 	echo "Rien"
# fi

# Trouver dans le répertoire d'origine, selon une expression régulière..
# ... les fichiers d'après le motif, et exécuter un déplacement

## Ajouter les lignes ici ##
if [ $presence -eq 1 ]; then
	echo "Les fichiers xsane qui vont être déplacés :"
	echo "             -----" # Positionner sous xsane
	echo ""
	find $source -maxdepth 1 -regex ~/"a0.*[0-99]\.txt" -print 2>/dev/null -exec mv {} $dest_xsane \;
# Je commenterais bien, mais ça date, je ne sais plus trop bien
# -maxdepth 1 : profondeur minimale, pour ne pas traiter les fichiers d'un peu partout
	echo ""
	echo "Les fichiers xsane ont éte déplacés vers :" $dest_xsane
	echo "             -----"
else
	echo "Il n'y a pas de fichier xsane à deplacer dans "$dest_xsane
# Cet exemple est à adapter selon vos besoin, d'autre(s) fichier(s)
fi

Hors ligne

#10 Le 30/08/2017, à 13:03

Watael

Re : [Résolu]expressions rationnelles dans un "if"

à la lecture, ça semble fonctionner.

tu peux simplifier

test -d "$dest" || mkdir "$dest"

et $presence n'est pas indispensable; teste directement le nombre d'éléments du tableau !

plutôt que de multiples echo, utilise un here-doc avec cat

cat <<eof
ligne
ligne : $variable
ligne
eof

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 31/08/2017, à 12:50

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Bonjour,

Oui, pour le "test -d"
parce que, en fait, j'en ai plusieurs : économie de lignes.

J'utilise $presence pour régler rapidement les problèmes, que j'avais eu, de syntaxe.
Là, il y a simplement :

(( ${#ar[*]} )) && presence=1 || presence=0

J'ai fait, très rapidement, en vain, quelque chose comme, par exemple :

(( ${#ar[*]} )) && presence=1 echo "essai" || presence=0 echo "essai 2"

Est-ce que ça marche, avec les retours à la ligne, etc ?

Pour le her.doc bon je vais voir, avec une documentation.
Je dois mettre une couleur plutôt que souligner.

Je pense que le script fonctionne, il doit évoluer.
Merci à vous tous.

Hors ligne

#12 Le 31/08/2017, à 13:06

pingouinux

Re : [Résolu]expressions rationnelles dans un "if"

Si tu veux absolument utiliser la variable presence, tu peux faire ceci :

presence=${#ar[*]}

Pour ton autre question :

(( ${#ar[*]} )) && { presence=1; echo "essai"; } || { presence=0; echo "essai 2"; }

Hors ligne

#13 Le 01/09/2017, à 09:36

bravorienaredire

Re : [Résolu]expressions rationnelles dans un "if"

Merci à vous deux,

J'ai assez de données pour faire.
Maintenant, c'est le temps ou le courage qu'il me manque.

Hors ligne