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 10/05/2012, à 10:16

Arbiel

[Résolu] Suppression intempestive de tous les éléments du bureau

Bonjour

Je viens de passer la commande

rm -fR "/home/${USER}/Bureau/${Jeu}"

qui a nettoyé tout ce qui était sur le bureau alors que je voulais uniquement supprimer le dossier ${Jeu} et tout ce qu'il contenait.

Quelle commande aurais-je dû utiliser ?

rm -fR "/home/${USER}/Bureau/${Jeu}/"
rm -fR --preserve-root "/home/${USER}/Bureau${Jeu}"
rm -fR --preserve-root "/home/${USER}/Bureau${Jeu}/"

ou encore une autre commande ?

Quel est le sens de --preserve-root : la racine ? (/) ou la racine relative à l'ordre rm, et comment cette racine se définit-elle ?

D'avance, merci pour vos conseils

Arbiel

Dernière modification par Arbiel (Le 10/05/2012, à 20:29)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#2 Le 10/05/2012, à 11:54

pingouinux

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Bonjour,
La première était bonne à condition que la variable $Jeu soit bien définie.
Il aurait mieux valu, pour être sûr de son coup, de faire auparavant :

cd "/home/${USER}/Bureau/${Jeu}"

et vérifier ainsi que le répertoire était bon.

L'option --preserve-root est activée par défaut, et évite de supprimer le répertoire racine / (racine de toute l'arborescence).

Hors ligne

#3 Le 10/05/2012, à 16:13

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

@pingouinux

Je te remercie pour ta réponse.

En fait, je comprends qu'il est impératif, et non pas préférable seulement, de faire le changement de répertoire et que rm -r supprime tout le contenu du répertoire courant, indépendamment du répertoire visé.

En effet, lorsque j'ai exécuté la commande, le répertoire courant était le bureau et tout ce qui était dessus a été supprimé.

Est-ce bien cela, la réalité. Auquel cas la page man de rm n'est absolument pas claire.

Arbiel

Edit : je viens de faire quelques tests, mais je ne peux en tirer aucune conclusion. Tout cela est bien bizarre, et j'ai la désagréable impression que le fonctionnement de rm -rf est aléatoire. La commande ne supprime pas systématiquement le contenu du répertoire courant. Dans les tests que je viens de faire, elle a bien uniquement supprimé le répertoire visé et son contenu. Et pourtant, elle a supprimé le contenu complet de mon bureau alors qu'elle visait le seul répertoire ${Jeu}.

Dernière modification par Arbiel (Le 10/05/2012, à 16:30)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#4 Le 10/05/2012, à 17:10

pingouinux

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

rm -fR rep1 rep2 rep3

supprime les répertoires rep1, rep2, rep3 et leur contenu, indépendamment du répertoire courant. Dans ton cas, je pense que la variable ${Jeu} n'était pas définie, ou bien que tu as laissé un espace entre .../Bureau/ et ${Jeu}, ou entre .../Bureau et /${Jeu}.

Hors ligne

#5 Le 10/05/2012, à 20:29

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Je te remercie. Tu m'as permis de comprendre mon erreur. il y avait bien un espace intempestif. Je viens de réaliser qu'il ne pouvait être que le premier caractère de la variable ${Jeu}. Il n'y a aucune autre explication possible, d'autant que je ne testais pas la présence d'un espace à cet endroit.

J'ai écrit une procédure pour automatiser un certain nombre de tâches relatives à wine. J'exécute des ordres tels que

bash /.ciel/scripts/ciel.sh [options] "nom du jeu, avec des blancs, des apostrophes, etc.."

J'initialise ${Jeu} au retour d'une procédure getopts d'extraction des options, qui me rend le numéro de l'argument désignant le jeu dans la variable ${OPTIND}. Je n'ai pas été capable de soustraire 1 de cette valeur pour pouvoir faire shift ${OPTIND} puis JEU={1}, aussi ai-je utilisé

eval Jeu='${'${OPTIND}'}'

Enfin, peu importe comment j'ai fait. Mais je n'ai pas testé si un espace intempestif venait s'intercaler dans le paramètre devant le nom du jeu.

Dans la plupart des cas, cet éventuel espace entraînerait incontestablement des erreurs d'exécution dans le script lors du traitement des fichiers. Mais, dans le cas présent, je venais de définir l'option -p, pour purge, dont l'effet était de n'exécuter que le code suivant

PurgeBureau() {
###############################################
#
#  Nettoyage du bureau avant initialisation
#
####################################################
    rm -f "/home/${USER}/Bureau/${Jeu}.desktop"
    rm -fR "/home/${USER}/Bureau/${Jeu}/"
    rm -f "/home/${USER}/Bureau/.Jeu"
}

il y avait donc un espace, et je vais modifier mon code en conséquence.

Merci beaucoup. C'est quand même rassurant d'avoir compris.

Arbiel

Dernière modification par Arbiel (Le 10/05/2012, à 20:32)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#6 Le 10/05/2012, à 22:52

pingouinux

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Arbiel #5 a écrit :

Je n'ai pas été capable de soustraire 1 de cette valeur pour pouvoir faire shift ${OPTIND} puis JEU={1}

shift $((OPTIND-1))

Contrairement à ce que j'ai dit en #4, un espace intempestif n'explique pas le problème, car il y avait des " " :

rm -fR "/home/${USER}/Bureau/${Jeu}"

Il faudrait voir ce que contenait réellement la variable Jeu.

Hors ligne

#7 Le 11/05/2012, à 01:18

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Effectivement les " empêchent la suppression des fichiers. Je viens de faire un test, en supprimant l'option -f pour voir les erreurs. Et la commande n'a rien supprimé du tout. Alors il est possible que ma variable ne contenait rien du tout, ou uniquement des espaces. Ce sont là les deux seules explications possibles

D'habitude, pour simplifier la frappe, je fais mes tests à partir d'un fichier bash qui contient la commande complète, et je peux vérifier après coup la valeur des paramètres. Mais dans le cas présent, pour tester mon option -p, j'ai rentré la commande sur un terminal. On peut imaginer que j'ai tapé deux " à la suite, ou avec un espace entre eux deux, par exemple en entrant la commande jusqu'à et y compris la première " et un espace, et ensuite en faisant un copier-coller avec le nom du jeu entre quotes. Ou encore, que j'ai entré l'option -p derrière le nom du jeu, et qu'alors OPTIND m'a fait aller chercher un paramètre vide. J'ai en effet constaté, antérieurement, que lorsque les options ne sont pas devant le nom du jeu, la variable Jeu est vide. J'ai voulu résoudre ce problème en appelant getopts successivement sur les paramètres qui commencent pas "-", et en initialisant Jeu avec le premier paramètre ne commençant pas par "-", mais comme j'ai rencontré des difficultés avec l'arithmétique, j'ai abandonné en me disant que les options seraient toujours devant le nom du jeu.

Il n'y a pas vraiment d'autres explications.

Je vais donc supprimer tous les espaces du début de la chaîne de caractères

shift $((OPTIND-1))
Jeu=${1/# /}

fonctionne parfaitement et vérifier ensuite que la longueur de la variable  ${Jeu} est positive.

Merci encore pour ton aide
Arbiel

Edit : je ne suis plus si certain que Jeu=${1/# /} marche bien car j'ai fait echo ${Jeu} derrière, et cela ne prouve rien !!

Dernière modification par Arbiel (Le 11/05/2012, à 01:23)


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#8 Le 11/05/2012, à 08:26

pingouinux

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Bonjour,

Arbiel #7 a écrit :

je ne suis plus si certain que Jeu=${1/# /} marche bien car j'ai fait echo ${Jeu} derrière, et cela ne prouve rien !!

Il suffit de faire :

echo "=$Jeu="

Hors ligne

#9 Le 11/05/2012, à 09:31

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Effectivement, et ce n'était pas vraiment difficile d'y penser tout seul. Peut-être était-ce dû à l'heure avancée de la nuit.

Et bien, cela ne marche pas. Je ne dois donc pas très bien comprendre ce que j'ai souligné ci-dessous

http://www.gnu.org/software/bash/manual/bashref.html#Word-Splitting a écrit :

${parameter/pattern/string}
    The pattern is expanded to produce a pattern just as in filename expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with ‘/’, all matches of pattern are replaced with string. Normally only the first match is replaced. If pattern begins with ‘#’, it must match at the beginning of the expanded value of parameter. If pattern begins with ‘%’, it must match at the end of the expanded value of parameter. If string is null, matches of pattern are deleted and the / following pattern may be omitted. If parameter is ‘@’ or ‘*’, the substitution operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘*’, the substitution operation is applied to each member of the array in turn, and the expansion is the resultant list.

Finalement, je fais comme cela

PLS() {
var=${1}
shift 1
eval ${var}='"'"${@}"'"'
}

shift $((OPTIND-1))
PLS "Jeu" ${1}

qui, en plus, réduit les suites d'espaces à un seul espace, ce qui n'est pas plus mal.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#10 Le 11/05/2012, à 12:09

Postmortem

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Salut,

Arbiel a écrit :

Et bien, cela ne marche pas. Je ne dois donc pas très bien comprendre ce que j'ai souligné ci-dessous

http://www.gnu.org/software/bash/manual/bashref.html#Word-Splitting a écrit :

${parameter/pattern/string}
    The pattern is expanded to produce a pattern just as in filename expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string

On va prendre un exemple, ça sera plus clair :

$ ma_variable=toto.tata.titi.tutu

$ echo "=${ma_variable/#*./REMPLACEMENT}=" # Remplace la plus longue partie (se trouvant au début à cause du #) correspondant à '*.' par [b]REMPLACEMENT[/b]
=REMPLACEMENTtutu=

$ echo "=${ma_variable#*.}=" # Supprime au début la plus courte partie correspondant à '*.'
=tata.titi.tutu=

$ echo "=${ma_variable##*.}=" # Supprime au début la plus longue partie correspondant à '*.'
=tutu=
$

Si tu fais comme ceci :

Jeu=${1/# /}

Tu cherches à remplacer la plus longue partie correspondant à une espace au début par rien (étant donné que tu n'as pas mis de REMPLACEMENT). Hors, la plus longue partie correspondant à une espace, et bien c'est une espace ! Cela supprime donc qu'une seule espace au début de $1 et la valeur est affectée à la variable Jeu.
Pour supprimer tous les espaces qui pourraient être au début de $1, je ferais ainsi :

shopt -s extglob
Jeu=${1##+( )}

Le shopt -s extglob permet d'activer la syntaxe +(pattern) qui veut dire au moins une fois le pattern.
+( ) veut donc dire 1 ou plusieurs espaces.
Et donc, ${1##+( )} veut dire que l'on supprime toutes les espaces au début. ( Si on avait fait ${1#+( )}, on aurait supprimé une seule espace au début, ce qui aurait donc été équivalent à ${1# } ou ${1## } ou encore ${1/# /} )

Dernière modification par Postmortem (Le 12/05/2012, à 11:11)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 11/05/2012, à 15:08

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

@ Postmortem

Merci pour ce complément d'informations.

Et si je comprends bien,

Jeu=${1##+(  )}

avec deux espaces entre les parenthèses supprimerait les espaces par couple de deux, en en laissant 1 si au départ il y en a un nombre impair ?

Le traitement des chaînes de caractères est extrêmement concis. Il est dommage que le document ne présente pas quelques exemples pour les béotiens comme moi.



Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#12 Le 11/05/2012, à 16:27

Postmortem

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Arbiel a écrit :

Et si je comprends bien,

Jeu=${1##+(  )}

avec deux espaces entre les parenthèses supprimerait les espaces par couple de deux, en en laissant 1 si au départ il y en a un nombre impair ?

Le traitement des chaînes de caractères est extrêmement concis. Il est dommage que le document ne présente pas quelques exemples pour les béotiens comme moi.

Arbiel

Exactement (j'avoue que j'ai essayé avant de te répondre ! )


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 11/05/2012, à 21:09

Arbiel

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

@ Postmortem

Merci pour ces informations. En essayant ton code, j'ai détecté une petite faute de frappe :

shopt -s extglob
Jeu=${1##+( )}

comme l'indique l'explication sur l'option en question, et non

shopt -s extglog
Jeu=${1##+( )}

Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#14 Le 12/05/2012, à 11:09

Postmortem

Re : [Résolu] Suppression intempestive de tous les éléments du bureau

Salut,
Ah oui, faute de frappe en effet, je corrige.
Bon w-e!


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne