Tilde (~) dans le répertoire de travail Unix


22

Donc, je travaille dans un environnement UNIX et j'ai remarqué que dans mon répertoire de travail, qui est à des kilomètres de ma maison UNIX, il y a un ~.

Maintenant, une fois dans le passé, je l'ai fait à rm -rf ~partir de mon répertoire de travail et j'ai fini par effacer complètement mon répertoire personnel et j'ai dû impliquer l'informatique.

Je ne veux pas recommencer. En même temps, je veux savoir

  1. Pourquoi est ~créé dans mon répertoire de travail? Est-ce un glissement de doigt défectueux lors de l'enregistrement ( :w!mais que se passe-t-il :w~? !!)

  2. Avant l'archivage, il existe un script qui recherche des fichiers ou des dossiers supplémentaires que p4 ne connaît pas, donc cela ~pourrait provoquer un problème. Alors, comment puis-je supprimer le ~de mon répertoire de travail et en même temps ne pas effacer ma maison?

J'ai une commande de sauvegarde appelée delque j'utilise à la place de rm -rf. Il place simplement les choses dans un emplacement temporaire. Je pourrais l'utiliser et me débarrasser du ~. Mais je suis plus intéressé à savoir pourquoi cela se produit et comment puis-je le supprimer?


Normalement, le shell remplace ~ au début d'un chemin par votre répertoire personnel. Utilisez le chemin complet /home/yourUserName/~pour accéder au répertoire appelé ~.
jofel

Et ~ otheruser / file peut être utilisé pour référencer les répertoires personnels d'autres utilisateurs, par souci d'exhaustivité.
godlygeek

On dirait une farce!
Xolve

Réponses:


36

Soit le citer:

rm -i '~'
rm -i "~"
rm -i \~

Ou référencez-le par un chemin, au lieu d'un simple nom de base:

rm -i ./~
rm -i /path/to/~

Notez que, bien qu'il s'agisse d'un nom de personnage unique à l'allure amusante, ce n'est conceptuellement pas différent que si vous aviez créé un fichier nommé SOME$PATHen faisant

touch 'SOME$PATH'

Et j'ai essayé de le supprimer en faisant:

rm -i SOME$PATH

( Attention: la variable SOME$PATH n'est pas citée ici pour le bénéfice de l'exemple. Elle serait normalement placée entre guillemets 'SOME$PATH' )

Dans les deux cas, le shell étend le nom que vous donnez et vous devez empêcher cela.

Aussi: Ne pas utiliser rm -rfpour supprimer un fichier! Le but de rm -rest de dire rmqu'il est OK de supprimer des répertoires. Si vous ne voulez pas supprimer accidentellement des répertoires entiers en essayant de supprimer des fichiers, ne passez pas habituellement -r!


12
Je viens de tester ça. :w~dans vim a créé un fichier appelé ~. rm ~retourné cannot remove /home/seth it is a directory. rm "~"a supprimé le fichier . Juste pour souligner , ne passe pas -rfautomatiquement .
Seth

4
+1 pour avoir recommandé d'omettre les options violentes par défaut. C'est comme faire kill -9par défaut, ce que j'ai vu.
Celada

Je vois que l'exemple rm -i $FOOne cite pas intentionnellement la variable pour le bien de l'exemple, mais quand même: montrer un exemple de shell impliquant rmet une variable non citée comme argument est TRÈS MAUVAIS , euh, désolé, indépendant du contexte. Je suis sûr que cela peut même être prouvé :) J'ajouterai une note - mais peut-être pourriez-vous changer l'exemple, un peu?
Volker Siegel

@VolkerSiegel, Point pris - J'ai pris part à votre montage, mais la note de bas de page semblait un peu trop lourde. J'ai également changé pour un nom de variable encore moins susceptible de causer des problèmes - la plupart des gens n'ont pas de fichier nommé SOME/bin:/usr/binn'importe où sur leur système de fichiers. :)
godlygeek

Oui, ça a l'air bien! (J'allais presque répondre: Quoi? Lourd? Avez-vous déjà rencontré un vrai problème de citation dans votre vie? à comprendre même sans mauvais exemples! )
Volker Siegel

1

Le tilde utilisé seul dans le contexte de ls ~listera votre répertoire personnel comme ~ est un raccourci vers votre répertoire personnel. Si vous l'avez fait, ls ~brownvous listerez le contenu du répertoire personnel de brown.

VIM, sauf indication contraire, créera une copie de sauvegarde d'un fichier modifié: myFile myFile ~.

Ce comportement est bon car il crée une sauvegarde mais si vous ne le souhaitez pas, ajoutez-y le fichier .vimrc: ne définissez aucune sauvegarde (avec laquelle je viens d'accéder vi ~/.vimrc).

Et bien sûr, comme d'autres l'ont dit, si vous avez un fichier appelé ~, échappez simplement au caractère en tant que \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

Cela pourrait être dû à des erreurs de frappe. Si votre TERM=xtermconfiguration ressemble à la mienne, pratiquement chaque touche de fonction de votre clavier enverra des séquences d'échappement comme ...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

Plus de la moitié de la sortie de infocmp -1contient des échappements de ~tilde sur ma machine - et je ne comprends pas ce que la plupart d'entre eux font. Je sais qu'au zshmoins mange en fait la partie échappée de la chaîne dans la plupart des cas - et ne laisse que le ~tilde .

Par exemple, en tapant echopuis <space>puis F6et <return>imprime ...

/home/mikeserv

La séquence d'échappement réelle envoyée est ...

kf6=\E[17~

Fait intéressant, il existe d'autres de ces séquences d'échappement qui contiennent des >caractères.

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

Ce sont des échappements couramment utilisés - chaînes de réinitialisation et d'initialisation. Il n'est pas difficile d'imaginer qu'un clavier ou une touche enfoncée de quelque sorte lorsqu'un shell interactif attend une entrée puisse entraîner des ~fichiers tronqués de manière aléatoire dans tout votre système de fichiers. Au moins, il surgit de temps en temps sur le mien.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.