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 ‘&&’
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 , 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
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 )
[ -z “$(ls -A ~/.local/share/Trash/files 2>&1)” ]
avec toutes les variantes.
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…
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.
[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…
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.