# Question sur test dossier présent ET vide

**URL:** <https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576 "2016-02-21T03:09:54Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/1 "2016-02-21T03:09:54Z")

</div>

Dans cette ligne :  
if [-e ~/.local/share/Trash/files]   
je teste bien la présence du dossier …/files  
MAIS, je voudrait tester, en même temps qu’il soit vide, donc j’ai remplacé ‘-e’ par '-s’  
if [-s ~/.local/share/Trash/files]   
Malheureusement, ça ne fonctionne pas.  
Ptet que ça n’est adapté qu’aux fichiers et non aux dossiers ?  
Comment opérer ce test complet : présent ET vide, double commande avec ‘&&’ ❓

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/2 "2016-02-21T03:09:54Z")

</div>

salut,

en effet, test -s ne fonctionne qu’avec les fichiers.

pour tester si un répertoire existe et est vide, il faut vérifier qu’il existe, et tenter de l’énumérer.

`if [-d "$repertoire"]; then
shopt -s dotglob nullglob
fichiers=( "$repertoire/"* )
(( ${#fichiers[@]} )) && echo "pas vide" || echo "est vide"
shopt -u dotglob nullglob
fi`

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/3 "2016-02-21T03:09:54Z")

</div>

Merci mais dommage que je ne puisse pas gérer ça plus simplement.  
J’ai une autre possibilité qui traite d’un fichier, cette fois et je vais ptet me retourner vers cette solution.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/4 "2016-02-21T03:09:54Z")

</div>

Y’a quand même moyen de faire vachement plus simple…

[code]DOSSIER="/chemin/vers/dossier"

if [“$(ls -A “$DOSSIER” 2\>&1)” = “”]; then  
echo "Dossier existant, énumérable, et vide"  
else  
echo "Dossier inexistant, ou non énumérable, ou pas vide"  
fi[/code]

À noter que l’option -A de ls assure qu’un dossier ne contenant que des fichiers cachés sera correctement considéré “non vide”.  
À noter également que la redirection 2\>&1 permet de traiter (en silence) à la fois l’(in)existence du dossier, et le cas où l’utilisateur courant n’a pas les droits suffisants pour énumérer le contenu du dossier.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/5 "2016-02-21T03:09:55Z")

</div>

Pas mal et peut facilement s’intégrer à mon autre condition existante.  
Je teste cet AM.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/6 "2016-02-21T03:09:56Z")

</div>

> [@ricardo](#):
>
> peut facilement s’intégrer à mon autre condition existante.

Question peut-être bête, mais en quoi la solution de Watael pose-t-elle un quelconque souci d’intégration avec le reste de ton script (c’est ce que semble indiquer ta remarque en tous cas) ? Au pire il suffit de l’isoler dans une fonction annexe (ce que je te conseille de faire de toutes façons avec tout ce qui n’est pas immédiatement clair, y compris la solution que je t’ai proposée, pour des raisons de maintenance future).

`if dossier_vide "$DOSSIER"; ...`est tout de même plus clair que

```auto
if ["$(ls -A "$DOSSIER" 2>&1)" = ""]; ...
```

… surtout quand tu reliras ça dans 2 ans…

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:09 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/7 "2016-02-21T03:09:56Z")

</div>

> [@syam](#):
>
> [quote=«&nbsp;ricardo&nbsp;»]peut facilement s’intégrer à mon autre condition existante.

Question peut-être bête, mais en quoi la solution de Watael pose-t-elle un quelconque souci d’intégration avec le reste de ton script (c’est ce que semble indiquer ta remarque en tous cas) ? Au pire il suffit de l’isoler dans une fonction annexe (ce que je te conseille de faire de toutes façons avec tout ce qui n’est pas immédiatement clair, y compris la solution que je t’ai proposée, pour des raisons de maintenance future).

`if dossier_vide "$DOSSIER"; ...`est tout de même plus clair que

```auto
if ["$(ls -A "$DOSSIER" 2>&1)" = ""]; ...
```

… surtout quand tu reliras ça dans 2 ans…[/quote]  
Simplement que ta solution me permet de remplacer une ligne par une autre ligne, alors que celle de Watel me faisait ajouter 3 lignes.  
Pour l’instant, ça fonctionne mais ça coince encore dans un cas extrêmement rare mais comme j’essaie le "parfait 😉, je cherche la parade.  
J’avais trouvé une solution, en une seule ligne et qui passait partout mais elle n’était pas «&nbsp;élégante&nbsp;», à mon goût. Je préfère la tienne.  
Pas de problème de compréhension, même dans 2 ans, je m’y retrouverai, je n’aurai alors que 77 ans et l’âge auquel on a encore le droit de lire Tintin 😃  
Sitôt trouvée, je poste ici.

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/8 "2016-02-21T03:10:03Z")

</div>

La même que Syam sans if else then fi`[-z $(ls -A dossier 2>&1)] && echo "dossier vide"\
 || echo "dossier plein ou inexistant"`

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/9 "2016-02-21T03:10:03Z")

</div>

Oui, j’ai testé et c’est aussi une solution.  
Par contre, si le dossier est absent, il annonce une erreur.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/10 "2016-02-21T03:10:04Z")

</div>

`if [-d dossier]; then
  if [-z $(ls -A dossier 2>&1)]; then
    echo "dossier vide"
  else
    echo "dossier non-vide"
else
  echo "dossier inexistant"
fi`  
ou en uniligne:

```auto

```

devrait marcher non ? (pas très enthousiaste)

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/11 "2016-02-21T03:10:04Z")

</div>

salut,

2\>&1 duplique la sortie d’erreur vers la sortie standard, ça ne la rend pas “silencieuse”.

`[-d "$repertoire"] && {
   ls -A "$repertoire" &>/dev/null && statut="pas vide" || statut="est vide"
} || statut="n'existe pas"
echo "$repertoire $statut"`ici, on ne teste que la valeur de retour de la commande, et toutes ses sorties (stdout et stderr) sont envoyées vers /dev/null.

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/12 "2016-02-21T03:10:04Z")

</div>

[quote=“ricardo”]Oui, j’ai testé et c’est aussi une solution.  
Par contre, si le dossier est absent, il annonce une erreur.[/quote]  
Une erreur ?  
Avec quel shell :  
J’avais testé ma proposition avec ksh sans aucune erreur, après ton message j’ai vérifié avec dash, j’ai juste dû rajouter des guillemets de cette manière :`[-z "$(ls -A dossier 2>&1)"] && echo "dossier vide"|| echo "dossier plein ou inexistant"`et je n’ai aucune erreur quelque soit le cas, dossier inexistant, vide ou plein.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/13 "2016-02-21T03:10:06Z")

</div>

Ha ! si vous acceptez les sorties d’erreur silencieuses, alors j’avais déjà depuis longtemps.  
Je pensais seulement que ce n’était pas très élégant et c’est pour ça que je cherchais autre chose.

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/14 "2016-02-21T03:10:06Z")

</div>

[code]$ ls -RAF  
.:  
empty/ full/

./empty:

./full:  
testFile  
$ videoupas() { [-z “$(ls ./”$1" 2\>&1)"] && echo “$1 vide” || echo “$1 pas vide”;}  
$ for rep in empty full nexistepas; do videoupas $rep; done  
empty vide #correct  
full pas vide #correct  
nexistepas pas vide #faux![/code]parce que la redirection de l’erreur vers la sortie standard fait que l’expression n’est pas vide.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/15 "2016-02-21T03:10:06Z")

</div>

[size=150]NE PAS TENIR COMPTE DE CE MESSAGE, JE VAIS LE REPRENDRE  
[/size]  
Votre solution de base à tous fonctionne correctement, dans tous les cas de figure et sans aucune erreur (même sans les envoyer dans le trou 😉 )  
[-z «&nbsp;$(ls -A ~/.local/share/Trash/files 2\>&1)&nbsp;»]  
avec toutes les variantes. ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
Pour ce faire, j’ai tout simplement modifié le dossier à traiter : …/Trash ==\> …/Trash/files  
À la ‹&nbsp;vidange&nbsp;›, de même, j’ai traité …/Trash/files et …/Trash/info, ainsi que le fichier ‹&nbsp;metadata&nbsp;›  
De cette façon, je n’ai plus d’erreurs dans le cas d’un ‹&nbsp;vidage&nbsp;› de corbeille à l’aide de l’icone.  
Voici l’écriture la plus simple que j’ai trouvée pour ce bloc (éventuelle variable pour le chemin) :

`echo -e "\033[4mCONTENU de la CORBEILLE\033[0m\n"
        if [-z $(ls -A ~/.local/share/Trash/files 2>&1)] 
	then
		echo "LA CORBEILLE EST VIDE"
	else
		ls ~/.local/share/Trash/files	
		read -p "on peut la vider ? o/* : " vider	 
			if ["$vider" = o] 
			then
				rm -rf ~/.local/share/Trash/files/*
				rm -rf ~/.local/share/Trash/info/*
				rm -f ~/.local/share/Trash/metadata
				echo "CORBEILLE VIDÉE"
			else
				echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
			fi
	fi `

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/16 "2016-02-21T03:10:08Z")

</div>

> [@Watael](#):
>
> 2\>&1 duplique la sortie d’erreur vers la sortie standard, ça ne la rend pas «&nbsp;silencieuse&nbsp;».

Sachant que la sortie standard est testée et non pas affichée sur la console, je maintiens qu’en cas d’erreur (dossier inexistant ou non énumérable) la commande reste silencieuse du point de vue de l’utilisateur.  
Mais là on pinaille tous les deux… 😉  
Et quitte à pinailler, la sortie d’erreur n’est pas dupliquée (littéralement, en double) mais redirigée.  
Bon j’arrête là, sinon tu vas finir par croire que je te cherche. ![:teasing-neener:](https://www.debian-fr.org/uploads/default/original/1X/e0ae327c77962ce0f95cc00254f0ad555183a065.gif "Neener Neener")

[quote=«&nbsp;ricardo&nbsp;»]`[...]
				rm -rf ~/.local/share/Trash/files/*
				rm -rf ~/.local/share/Trash/info/*
[...]`[/quote]  
Quid des fichiers cachés ? Fais l’essai après avoir mis un fichier «&nbsp;.test&nbsp;» à la corbeille… 😉

Il faut supprimer à la fois les fichiers normaux (\*) et les fichiers cachés (.\*).  
Accessoirement, la redirection 2\>/dev/null dans les cas .\* évite que des messages d’erreur ne s’affichent sur la console concernant les répertoires . et .. (dont on se contrefout).

`rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/files/.* 2>/dev/null
rm -rf ~/.local/share/Trash/info/*
rm -rf ~/.local/share/Trash/info/.* 2>/dev/null`

---

<div class="post-metadata">

**Author:** ![Watael](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/w/a4c791/32.png) [@Watael](https://www.debian-fr.org/u/Watael)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/17 "2016-02-21T03:10:08Z")

</div>

silencieuse pour l’utilisateur, OK. mais pas pour le shell, d’où l’erreur que montre mon post précédent.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/18 "2016-02-21T03:10:09Z")

</div>

[quote=“syam”]…

`rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/files/.* 2>/dev/null
rm -rf ~/.local/share/Trash/info/*
rm -rf ~/.local/share/Trash/info/.* 2>/dev/null`[/quote]  
Oui, tu as raison de ne pas les oublier.  
de toutes façons, cette partie doit être réduite mais je ne veux pas trop me mélanger, donc je la met de côté pour l’instant.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/19 "2016-02-21T03:10:10Z")

</div>

Depuis une heure je cherche à placer ça dans tous les ordres mais rien ne fonctionne : il me trouve la corbeille pleine, alors que les dossiers concernés sont vides de chez vide.

`corbeille="~/.local/share/Trash/files"
if [-d "$corbeille"] && [-z $(ls -A "$corbeille") &> /dev/null]
`  
Réponse :

[code]CONTENU de la CORBEILLE

on peut la vider ? o/\* :  
[/code]  
et je voudrais trouver :

[code]CONTENU de la CORBEILLE

LA CORBEILLE EST VIDE  
prêt pour la sauvegarde ? o/\* :  
[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:10 UTC](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576/20 "2016-02-21T03:10:10Z")

</div>

Tu n’a pas inversé la condition ?

`if [-d "$corbeille"] && [-z $(ls -A "$corbeille") &> /dev/null]; then
   echo "vide"
else
  echo "pleins"
fi`  
Parce que chez moi ça marche.

[Page suivante](https://www.debian-fr.org/t/question-sur-test-dossier-present-et-vide/33576.md?page=2)
