Répertoire créé accidentellement nommé «~» (tilde)

47

J'ai réussi à faire un répertoire nommé littéralement~ .

(Apparemment, Python le os.mkdir('~/something')fait.)

Comment puis-je l'enlever sans détruire ma maison?

Aussi, si cela peut aider, j'ai mon réel /homesur une partition séparée. Et le duplicata ~est situé dans (le réel ) ~.

UniversellementUniqueID
la source
51
XKCD obligatoire . Ok, j'ai peut-être menti sur le fait que ce soit obligatoire. Et être un XKCD.
Jesvin Jose
30
Pour répondre à la question Python que vous n’avez pas posée, utilisez à l’avenir os.mkdir(os.path.expanduser('~/something')).
Matt Nordhoff
8
... juste par curiosité, puisque vous avez créé le répertoire en python, n'avez-vous pas pensé à le os.rmdir('~/something')supprimer?
Bakuriu
@Bakuriu Finalement, je fait comprendre cela
UniversallyUniqueID

Réponses:

73

Echappez le ~avec \~ou utilisez des guillemets simples '~'. afin que vous puissiez

rmdir ~/\~

ou

cd ~ ; rmdir '~'
Marcin Krasowski
la source
43
Si vous êtes inquiet au sujet de la suppression de quelque chose que vous ne devriez pas, vous pouvez d'abord faire quelque chose de non destructif tel que: mv '~' nom normal, puis supprimer le répertoire nom normal.
Chris Jefferson
53
rmdirest non destructif. rmdirsupprime uniquement les répertoires vides. Par conséquent, si vous essayez rmdirun répertoire contenant quelque chose, rmdirrefuse de le supprimer.
Hitechcomputergeek
3
Vous n’avez même pas besoin d’échapper au tilde dans la première de ces commandes - ~n’est développé spécialement que au début d’un "mot" shell.
Henning Makholm
1
Vous pouvez même juste rmdir *. Comme il ne supprime que les répertoires vides, vous n'avez pas à vous soucier de la destruction de celle-ci.
Benubird
@ChrisJefferson: Si vous voulez vérifier d'abord votre commande, utilisez-la ls -dpour voir si elle répertorie le répertoire ou le fichier que vous souhaitez. Pas besoin de quoi que ce soit avec un effet comme mv.
Peter Cordes
42

Ce que python donne, python enlève:

$ python -c 'import os; os.makedirs("~/foo")'; tree; python -c 'import os; os.removedirs("~/foo")'; tree
.
└── ~
    └── foo

2 directories, 0 files
.

0 directories, 0 files

Si vous le faisiez os.mkdir, vous pourriez l'annuler avec os.rmdir(et de même pour os.makedirset os.removedirs).

muru
la source
36

Vous pouvez soit échapper le nom du répertoire en utilisant une barre oblique inverse comme celle-ci (en supposant que vous travaillez dans le répertoire parent de celui que vous souhaitez supprimer):

rmdir \~

Ou vous pouvez utiliser des chemins relatifs avec un point comme répertoire actuel (également lorsqu'ils sont situés dans le répertoire parent):

rmdir ./~

Ou vous pouvez utiliser le chemin absolu complet:

rmdir /home/USERNAME/~

Et pas de soucis, rmdirne peut que supprimer les répertoires vides. Si vous tapez mal la commande par inadvertance et que le chemin est évalué dans votre répertoire personnel, cela n’est pas dangereux car il contient des fichiers:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Byte Commander
la source
J'aime l'option de chemin relatif. Il devrait être impossible de mapper ./~vers ~/, quel que soit le répertoire dans lequel vous vous trouvez. Situation similaire avec le chemin absolu complet.
MBraedley
2

findle commandement peut faire de tels miracles. La commande

ls -i

vous donnera le numéro d'inode de fichiers ou le répertoire. Ensuite, vous pouvez utiliser findpour supprimer ces fichiers ou répertoires en utilisant:

find . -inum <inode-number> -delete #for a file

et

find . -inum <inode-number> -exec rm -rf {}\; #for directories
utilisateur2763554
la source
1

Ce qui aurait dû être fait

Vous auriez dû jouer d' home=os.path.expanduser("~")abord et ensuite os.path.join(home,"something"). Le ~est traité comme du texte en python et ne se développe pas comme dans les bashautres shells.

$ python -c 'import os;home=os.path.expanduser("~"); os.mkdir(os.path.join(home,"something"))'                                                                                          

$ ls -ld ~/something
drwxrwxr-x 2 xieerqi xieerqi 4096 7月  12 21:00 /home/xieerqi/something/

Comment s'en débarrasser

En plus des méthodes déjà mentionnées, nous pouvons utiliser la valeur hexadécimale pour ~la table de caractères ascii, qui, contrairement à la valeur actuelle, ~ne s'étend pas au répertoire de base de l'utilisateur en ligne de commande (Si vous vous le demandez, le tilde apparaît au début de un mot, il se développe dans le répertoire de base de l'utilisateur. Comparez ls ~et ls $'\x7e').

Voici comment cela fonctionnerait:

# Make the directory
$ mkdir ./~                                                                                                                                                                             
$ stat ./$'\x7e'                                                                                                                                                                        
  File: './~'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 5768019     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2017-07-12 21:05:31.382828424 -0600
Modify: 2017-07-12 21:05:31.382828424 -0600
Change: 2017-07-12 21:05:31.382828424 -0600
 Birth: -

# and remove it 
$ rmdir ./$'\x7e'                                                                                                                                                                       
$ ls $'\x7e'
ls: cannot access '~': No such file or directory
Sergiy Kolodyazhnyy
la source