Question sur test dossier présent ET vide

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 ‘&&’ :question:

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

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.

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.

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

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

… surtout quand tu reliras ça dans 2 ans…

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

… 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 :wink:, je cherche la parade.
J’avais trouvé une solution, en une seule ligne et qui passait partout mais elle n’était pas “élégante”, à 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 :smiley:
Sitôt trouvée, je poste ici.

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

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

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:

devrait marcher non ? (pas très enthousiaste)

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.

[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.

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.

[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.

[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 :wink: )
[ -z “$(ls -A ~/.local/share/Trash/files 2>&1)” ]
avec toutes les variantes. :023
Pour ce faire, j’ai tout simplement modifié le dossier à traiter : …/Trash ==> …/Trash/files
À la ‘vidange’, de même, j’ai traité …/Trash/files et …/Trash/info, ainsi que le fichier ‘metadata’
De cette façon, je n’ai plus d’erreurs dans le cas d’un ‘vidage’ 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

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… :wink:
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:

[quote=“ricardo”][...] 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 “.test” à la corbeille… :wink:

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

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

[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.

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]

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.