Pour en finir avec le bloc "corbeille"

J’ai supprimé la partie “test d’existence du dossier …/files” car ce n’est pas un dossier créé pour la cause et de plus, il se régénère à chaque ajout dans la corbeille.
J’ai testé ce bloc sous toutes les possibilités et je n’ai pas trouvé d’erreur. La seule, que je cache avec “&> /dev/null” dans la ligne “rm -fr” est là pour éviter l’annonce logique : rm: impossible de supprimer le répertoire : « /home/ricardo/.local/share/Trash/files/. » rm: impossible de supprimer le répertoire : « /home/ricardo/.local/share/Trash/files/.. »

La seule chose que je n’arrive pas à faire, c’est de “réduire” la ligne “rm -rf”. Malgré tous mes efforts, il refuse d’accepter les variables. Je ne sais certainement pas m’y prendre correctement.

[code]# Teste si la corbeille est pleine (présence de fichier(s) dans … /files), si elle l’est, liste les fichiers qu’elle contient

echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

corbeille=~/".local/share/Trash/files"

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

[/code]

salut,

pour faire propre et concis en bash :

Merci mais peux-tu m’expliquer de façon plus profonde car je suis un débutant en bash. Il y a un mois, je n’y avais jamais touché sinon pour passer une ligne de commande.
Là, il y a plein d etermes qui me sont inconnus.
Si ça te gonfle, et je te comprendrai, passe-moi un lien où je pourrai m’instruire de tous ces termes, de façon “pour les nuls”.

EDIT :
Je crois comprendre que ça vire les deux dossiers en questions et le fichier restant ? c’est ça ?

EDIT 2 :
les fichiers cachés sont aussi considérés ?

shopt
contrôle des options du shell
-s positionne une option
-u désactive l’option

dotglob
Si existante, bash inclut les noms de fichiers commençant par un « . » dans les résultats des développements de chemins.

pour les { } (qu(il ne faut pas confondre avec une liste de commandes), voici un exemple :

echo tra_{la,lalère} tra_la tra_lalère
qui devrait en fait s’écrireecho tra_la{,lère}

l’usage d’un sub-shell (cmd; cmd), permet de ne pas modifier les options du shell courant, seulement celles du sub-shell, et donc de ne pas avoir à faire shopt -u dotglob.

le man expliquera peut-être mieux.
pour les commande, il y a aussi help cmd

le controversé (parce que plus très actuel, bien que mis à jour) Advanced Bash Scripting
le wiki de Greg Wooledge

Merci pour tes explications précises.
Je suis d’une époque où on apprenait le latin et pas l’anglais et même si j’ai eu l’occasion de baragouiner un peu cette dernière langue, ça me gonfle de devoir faire autant d’efforts. C’est pour cette raison que je recherche, de préférence, les pages en FR.

EDIT :
Super cet exemple, il vaut 100 lignes d’explications. Napoléon n’avait pas toujours tort :wink:

[code]pour les { } (qu(il ne faut pas confondre avec une liste de commandes), voici un exemple :
Code:
echo tra_{la,lalère}
tra_la tra_lalère

qui devrait en fait s’écrire
Code:
echo tra_la{,lère}[/code]

l’ABS en français sur traduc.org

Oui, c’est déjà une de mes lectures préférées.
Ça me semble assez complet, bien détaillé et assez didactique.
La seule chose que je reproche à ce site, c’est d’être presque trop complet. Il est difficile de s’y retrouver, rien que dans la page d’accueil.
Ainsi, avant toute chose, il faut que je m’imprègne correctement de toutes les constructions car je me perds un peu dans les (…), {…}, […], ((…)), {{…}}, [[…]]
Il me faut aussi assimiler les différentes structure avec les variables : $var, “$var”, ($var), (${var}), etc.
Mais je suis tenace et j’y arriverai, même si je dois vous emmerder encore quelques années.

Testé : parfait.
On passe à autre chose ou on peut encore améliorer ?

[code]echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

corbeille=~/".local/share/Trash/files"

if [ -z $(ls -A "$corbeille") &> /dev/null ] 
then
	echo "LA CORBEILLE EST VIDE"		
else
	ls -a ~/.local/share/Trash/files 	
	read -p "on peut la vider  ? o/* : " vider	 
		if [ "$vider" = o ] 
		then	
			(shopt -s dotglob; rm -rf ~/.local/share/Trash/{files,info}/*)
			rm -f ~/.local/share/Trash/metadata
			echo "CORBEILLE VIDÉE"
		else
			echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
		fi		
fi 		

[/code]

Rien… ou presque :slightly_smiling:

Je vais faire mal aux mouches, mais même si je comprends ceci :

Je préfère écrire cela :

shopt -s dotglob rm -rf ~/.local/share/Trash/{files,info,metadata}/* shopt -u dotglob
On économise un fork, ça ne fait pas de mal. Pour l’utilisation du -r sur un dossier qui ne contiens pas (j’imagine) de dossier n’est pas gênant.

J’y avait pensé Michel mais “metadata” est un FICHIER et non un dossier comme les deux autres.
Est-ce que ‘rm -rf’ va fonctionner pour un fichier ?
Tu me diras que pour ce que ce fichier contient, on pourrait même l’oublier.
Regarde chez toi et juge, après avoir mis qq chose à la poubelle.

Je n’ais pas de poubelle, mais une broyeuse.
Si metadata est un fichier ceci devrait faire l’affaire (testé) :

shopt -s dotglob rm -rf ~/.local/share/Trash/{files/,info/,metadata}* shopt -u dotglob

Non, metadata subsiste alors que les deux dossiers sont vidées

ricardo@sid-sda8:~$ ls ~/.local/share/Trash/files ricardo@sid-sda8:~$ ls ~/.local/share/Trash/info ricardo@sid-sda8:~$ ls ~/.local/share/Trash files info metadata ricardo@sid-sda8:~$ cat ~/.local/share/Trash/metadata [Cached] Size=10

Quel shell utilises-tu ? Chez moi (je viens juste de tester) ça fonctionne impeccablement sous bash, mais pas sous dash (et donc pas sous sh non plus, car il pointe vers dash par défaut).

NB: je parle bien évidemment du shell utilisé par ton script, car je suppose que tu testes à partir du script lui-même, pas en interactif ?

#!/bin/bash
pourtant !
je teste bien d’après mon script.
Par contre, dash est AUSSI installé.
Je pense toutefois que c’est le sha-bang qui commande, non?

Edit :
Attends, nouvel essai et je reviens ici même

EDIT 2 :
Mea-culpa :blush:
Je n’avais pas fait attention que Michel avait enlevé le dernier ‘/’
rm -rf ~/.local/share/Trash/{files/,info/,metadata}[size=150]/[/size]*

Donc, ça fonctionne parfaitement :023

Maintenant Michel, peux-tu m’expliquer en quoi les () sont, de préférence, à proscrire ?

Question de performance : les () lancent un sous-shell, c’est à dire un processus supplémentaire. C’est beaucoup plus lourd en ressources qu’en restant dans le même shell, d’autant que shopt est un builtin de bash (il fait partie intégrante de bash, et ne lance aucun processus externe) et ne consomme donc quasiment aucune ressource…

Et accessoirement, c’est plus lisible/compréhensible sans les parenthèses, ça évite d’avoir à se rappeler qu’on lance un sous-shell et donc que les options ne sont pas conservées après la parenthèse fermante (mais ça c’est juste l’opinion personnelle du fainéant que je suis :wink:).

Je n’aurais pas mieux dis.

Dernier truc, la corbeille n’est pas forcément dans ~/.local/share/Trash/. Ça dépend de la configuration XDG. Grosso modo elle est soit dans $XDG_DATA_HOME/Trash, soit (si la variable $XDG_DATA_HOME n’est pas positionnée) $HOME/.local/share/Trash.

Tu ajoute les 3 lignes qui corrigent ? :slightly_smiling:

@ Syam :
Merci pour cette explication claire et convaincante.

[quote=“MisterFreez”]Dernier truc, la corbeille n’est pas forcément dans ~/.local/share/Trash/. Ça dépend de la configuration XDG. Grosso modo elle est soit dans $XDG_DATA_HOME/Trash, soit (si la variable $XDG_DATA_HOME n’est pas positionnée) $HOME/.local/share/Trash.

Tu ajoute les 3 lignes qui corrigent ? :slightly_smiling:[/quote]

Je veux bien essayer mais tu es sûr qu’il n’y a que ces deux possibilités ?

en Français, que veut dire $XDG_DATA_HOME/ ?

Voici les deux pages du standard freedesktop :
standards.freedesktop.org/basedi … 01s02.html
standards.freedesktop.org/basedi … 01s03.html

Le premier indique que $XDG_DATA_HOME est le dossier qui doit contenir les données spécifiques à l’utilisateur et qu’il doit être inscriptible. Le second explique que si la variable d’environnement $XDG_DATA_HOME n’existe pas ou est vide alors il faut utiliser $HOME/.local/share.

Les éventuels bureaux qui mettent leur corbeille ailleurs ne respectent pas le standard freedesktop. Tu pourras les ajouter au fur et à mesure des remontées (personne ne t’embêteras parce que tu as respecté les standards et pas chaque spécificité de chaque bureau).

Ok, je vois tout ça dans la soirée :006

Question préliminaire :
Dans la ligne du milieu, est-il possible de remplacer seulement ce qui est en rouge par une variable et, si oui, comment écrire toute la ligne car il doit y avoir des () ou {} à ajouter, je suppose ?

[quote]shopt -s dotglob
rm -rf ~/.local/share/Trash/{files/,info/,metadata}*
shopt -u dotglob[/quote]