Pour effacer un fichier qui commence par un "-" comme "-machin" alors il faut faire rm -- -machin (très utile quand on fait une erreur du style "touch toto -t" ;p)
Cette option sert plus généralement a ignorer ce qui suit sur la ligne de commande. Il devient donc possible d'éffacer un fichier nomé -rf avec :
rm -- -rf
et pour supprier un fichier nomé .* :
on encadre le nom du fichier avec "" (pour que les caractéres spéciaux ne soient pas interprétés)
rm ".*"
> Cette option sert plus généralement a ignorer ce qui suit sur la ligne de commande
C'est plutôt pour indiquer que le paramètre suivant commançant pas un '-' n'est pas une option. Sinon, pour ignorer ce qui suit sur la ligne de commande c'est le caractère '#' .
"--" marche avec toute les commandes gnu. Exemple : pour voir s'il y a "-i" dans le fichier toto.txt
$ grep -- -i toto.txt
Plus exactement c'est pour demander au getopt() d'arreter de jouer avec argv. Donc tout ce qui suit un « -- » (et pas seulent le prochain flag) est considéré par le programme comme faisant partie de ce qu'on appelle parfois les « non-option arguments ». Et ca marche avec tout ce qui utilise getopt(), gnu ou pas.
une autre méthode moins efficace, mais certainement plus sure:
ls -i pour avoir l'i-node du fichier à effacer; puis find . -inum inode -exec rm {} \;
Au fait, touch toto -t ne crée pas de fichier sur toutes les plateforme. Sur Cygwin et linux, touch se plaint qu'il ne connait pas l'option -t. Par contre sur Solaris, la commande fonctionne et crée le fichier -t.
« Mettre à jour les dates d'accès et de modification de chaque FICHIER
selon la date courante.
Les arguments obligatoires pour les options de formes longues le sont aussi
pour les options de formes courtes.
-a modifier seulement la date d'accès
-c, --no-create ne créer aucun fichier
-d, --date=CHAÎNE analyser la CHAÎNE et l'utiliser au lieu
de la date courante
-f (ignorée)
-m modifier seulement la date de modification
-r, --file=FICHIER utiliser la date du FICHIER comme référence
au lieu de la date courante
-t DATE utiliser la DATE selon le format:
[[CC]AA]MMJJhhmm[.ss]
comme tampon date-heure au lieu de la date courante
--time=CODE -a pour « atime », -m pour « mtime », -m pour modifié,
-a pour utilisé
--help afficher l'aide-mémoire
--version afficher le nom et la version du logiciel
Noter que les options -d et -t acceptent différents formats de date et d'heure.
Rapporter toutes anomalies à <bug-coreutils@gnu.org>. »
Donc une option -t, avec GNU coreutils.
Mais bien entendu, tu parlais de « linux », et donc il n'est pas certain que tu parlais du touch de GNU.
voici ce que j'obtiens comme info sur mon "touch"
>touch --version
touch (GNU fileutils) 4.0.36
Writen by Paul Rubin, Arnold Robbins, Jim Kingdon, David MacKenzie, and Randy.
...
>
Ce que je voulais dire c'est que sur certaines plateformes on va creer le fichier -t . Auquel cas l'astuce proposée est valable. Sur d'autre plateforme plus intelligente, touch va d'abord faire une verification de ses arguments et ne va pas laisser passer le fait que si on lui donne une option apres le nom d'un fichier ca ne correspond pas a l'utilisation normale de la commande.
La remarque de Damien était pertinente.
En effet, le but est d'éviter l'interprétation des caractères spéciaux par le shell.
Exemple :
$ echo / > '`rm -Rf $HOME`'
$ ls
`rm -Rf $HOME`
À ton avis, que se passera-t-il (n'essaye pas) si tu tapes :
$ rm `rm -Rf $HOME`
Pour effacer ce fichier, il faudra que tu utilises une autre astuce que rm ./`rm -Rf $HOME` pour contrecarrer les caractères spéciaux présents dans le nom. Et dans ce cas, l'astuce de Damien évite tout effet de bord, car find ne passe pas par un sous-shell pour lancer l'exécution de rm.
Mainteneur de LiquidPrompt - https://github.com/nojhan/liquidprompt
Je déconseille vivement le coup du find pour la raison suivante : si plusieurs filesystems sont montés sous le répertoire sur lequel tu lance le find, ça va effacer tous les fichiers qui ont ce numéro d'inode sur tous les devices montés sous ce répertoire. A moins d'utiliser l'option -xdev (ou -mount) de find.
Le but était de faire plus sûr, mais pour le coup la solution est plutôt pire que le problème...
cd /home
il ne faut pas faire rm -rf ~toto, sinon vous supprimer le répertoire de l'utilisateur toto (/home/toto).
mais bien rm -rf "~toto" ou le chemin complet /home/~toto :)
Single-Quotes
Enclosing characters in single-quotes ( '' ) shall preserve the literal value of each character within the single-quotes. A single-quote cannot occur within single-quotes.
Double-Quotes
Enclosing characters in double-quotes ( "" ) shall preserve the literal value of all characters within the double-quotes, with the exception of the characters dollar sign, backquote, and backslash, as follows:
l'étoile devrait être donc préservée dans la double quote.
# l' "option" --
Posté par Florent MANENS . Évalué à 2.
rm -- -rf
et pour supprier un fichier nomé .* :
on encadre le nom du fichier avec "" (pour que les caractéres spéciaux ne soient pas interprétés)
rm ".*"
[^] # quotes
Posté par jbcombes . Évalué à 1.
Ecrire ".*" dans un shell sera transformé en la liste des fichiers commencant par .
Ecrire '.*' ne pas interprété d'aucune façon.
[^] # Re: quotes
Posté par Guillaume Gimenez (site web personnel) . Évalué à 1.
> Ecrire '.*' ne pas interprété d'aucune façon.
même pas vrai!
regarde plutôt ça:
-{ploki@jesus:~}-
$ A=coucou
-{ploki@jesus:~}-
$ echo $A *
coucou Desktop Documents GNUstep Nautilus nsmail
-{ploki@jesus:~}-
$ echo "$A *"
coucou *
-{ploki@jesus:~}-
$ echo '$A *'
$A *
-{ploki@jesus:~}-
$
[^] # Re: quotes
Posté par Dolmen (site web personnel) . Évalué à 1.
Mainteneur de LiquidPrompt - https://github.com/nojhan/liquidprompt
[^] # Re: quotes
Posté par Guillaume Gimenez (site web personnel) . Évalué à 1.
screenshots pour prouver ce qu'il dit...
t'as qu'à faire
$ man bash
[^] # Re: quotes
Posté par Salagnac . Évalué à 1.
~ $bash --version
GNU bash, version 2.05a.0(1)-release (powerpc-ibm-aix4.3)
Copyright 2001 Free Software Foundation, Inc.
~ $echo "prog/*"
prog/*
~ $echo 'prog/*'
prog/*
~ $echo prog/*
prog/algo2 prog/bd prog/c prog/fvwm prog/irc prog/java prog/nedit_macros prog/projet_compil prog/rezo prog/systeme
donc je ne sais quoi conclure.
[^] # Re: l'
Posté par matiasf . Évalué à 1.
C'est plutôt pour indiquer que le paramètre suivant commançant pas un '-' n'est pas une option. Sinon, pour ignorer ce qui suit sur la ligne de commande c'est le caractère '#' .
"--" marche avec toute les commandes gnu. Exemple : pour voir s'il y a "-i" dans le fichier toto.txt
$ grep -- -i toto.txt
et
$ grep -- -i toto.txt # super cette commande
marche de la même façon.
[^] # Re: l'
Posté par Matafan . Évalué à 1.
# Autre méthode...
Posté par calo . Évalué à 1.
[^] # Re: Autre méthode...
Posté par damien didier . Évalué à 1.
ls -i pour avoir l'i-node du fichier à effacer; puis find . -inum inode -exec rm {} \;
Au fait, touch toto -t ne crée pas de fichier sur toutes les plateforme. Sur Cygwin et linux, touch se plaint qu'il ne connait pas l'option -t. Par contre sur Solaris, la commande fonctionne et crée le fichier -t.
[^] # Re: Autre méthode...
Posté par Anonyme . Évalué à 1.
Moi, avec GNU/Linux, j'ai
« Mettre à jour les dates d'accès et de modification de chaque FICHIER
selon la date courante.
Les arguments obligatoires pour les options de formes longues le sont aussi
pour les options de formes courtes.
-a modifier seulement la date d'accès
-c, --no-create ne créer aucun fichier
-d, --date=CHAÎNE analyser la CHAÎNE et l'utiliser au lieu
de la date courante
-f (ignorée)
-m modifier seulement la date de modification
-r, --file=FICHIER utiliser la date du FICHIER comme référence
au lieu de la date courante
-t DATE utiliser la DATE selon le format:
[[CC]AA]MMJJhhmm[.ss]
comme tampon date-heure au lieu de la date courante
--time=CODE -a pour « atime », -m pour « mtime », -m pour modifié,
-a pour utilisé
--help afficher l'aide-mémoire
--version afficher le nom et la version du logiciel
Noter que les options -d et -t acceptent différents formats de date et d'heure.
Rapporter toutes anomalies à <bug-coreutils@gnu.org>. »
Donc une option -t, avec GNU coreutils.
Mais bien entendu, tu parlais de « linux », et donc il n'est pas certain que tu parlais du touch de GNU.
[^] # Re: Autre méthode...
Posté par damien didier . Évalué à 1.
>touch --version
touch (GNU fileutils) 4.0.36
Writen by Paul Rubin, Arnold Robbins, Jim Kingdon, David MacKenzie, and Randy.
...
>
Ce que je voulais dire c'est que sur certaines plateformes on va creer le fichier -t . Auquel cas l'astuce proposée est valable. Sur d'autre plateforme plus intelligente, touch va d'abord faire une verification de ses arguments et ne va pas laisser passer le fait que si on lui donne une option apres le nom d'un fichier ca ne correspond pas a l'utilisation normale de la commande.
[^] # Re: Autre méthode...
Posté par gnumdk (site web personnel) . Évalué à 1.
Touch suxor :)
Comme ca, il n'y a pas d'ambiguité, sur toute les platformes, le -t sera créer.
[^] # Re: Autre méthode...
Posté par Matthieu Moy (site web personnel) . Évalué à 1.
$ > toto
Invalid null command.
$ touch toto
$ rm toto
rm: remove `toto'? y
(Hint : J'utilise tcsh)
[^] # Re: Autre méthode...
Posté par wmaker . Évalué à 1.
[^] # Re: Autre méthode...
Posté par Matthieu Moy (site web personnel) . Évalué à 1.
Essaie la commande
find . -inum inode -exec echo {} \;
pour te convaincre que ta ligne de commande a base de find execute exactement la meme chose que rm ./-toto.
[^] # Re: Autre méthode...
Posté par Dolmen (site web personnel) . Évalué à 0.
Mainteneur de LiquidPrompt - https://github.com/nojhan/liquidprompt
[^] # Re: Autre méthode...
Posté par Matafan . Évalué à 1.
Le but était de faire plus sûr, mais pour le coup la solution est plutôt pire que le problème...
# Re: effacer -machin
Posté par Anonyme . Évalué à 1.
Exemple :
/home/toto
/home/~toto
cd /home
il ne faut pas faire rm -rf ~toto, sinon vous supprimer le répertoire de l'utilisateur toto (/home/toto).
mais bien rm -rf "~toto" ou le chemin complet /home/~toto :)
@+ Whoo
[^] # Re: effacer -machin
Posté par Se David . Évalué à 1.
?
[^] # Re: effacer -machin
Posté par Brice Carpentier . Évalué à 1.
[^] # Re: effacer -machin
Posté par Vincent (site web personnel) . Évalué à 2.
[^] # Re: effacer -machin
Posté par adonai . Évalué à 1.
# Re: effacer -machin
Posté par Anonyme . Évalué à 1.
nous voyons donc ici : (d'après les posts)
soit la non-complétude des normes UNIX
soit le non respet de ces normes.
reste à déterminer la cible et : jetez les pierres !
http://www.unix.org/single_unix_specification/(...)
Single-Quotes
Enclosing characters in single-quotes ( '' ) shall preserve the literal value of each character within the single-quotes. A single-quote cannot occur within single-quotes.
Double-Quotes
Enclosing characters in double-quotes ( "" ) shall preserve the literal value of all characters within the double-quotes, with the exception of the characters dollar sign, backquote, and backslash, as follows:
l'étoile devrait être donc préservée dans la double quote.
# Ouai ben moi...
Posté par fmaz fmaz . Évalué à 2.
rm ./-i et autre, j'utilisais un bête
gestionnaire de fichier.
Clic le fichier, paf le fichier.
# unlink
Posté par ang . Évalué à 1.
unlink '-Rf'
etc.
En revanche, sous Linux en particulier, la commande ne fonctionne pas pour les répertoires (il faut utiliser rmdir).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.