Случайно созданный каталог с именем «~» (тильда)

47

Мне удалось сделать каталог буквально по имени ~.

(Видимо, это os.mkdir('~/something')делает Python .)

Как я могу удалить его, не разбивая мой дом?

Кроме того, если это помогает, у меня есть свой реальный /homeна отдельном разделе. И дубликат ~находится в ( настоящий ) ~.

UniversallyUniqueID
источник
51
Обязательный XKCD . Хорошо, возможно, я солгал, что это обязательно. И быть XKCD.
Джесвин Хосе
30
Чтобы ответить на вопрос Python, который вы не задавали, в будущем используйте os.mkdir(os.path.expanduser('~/something')).
Мэтт Нордхофф
8
... просто для любопытства, поскольку вы создали каталог в python, не думаете ли вы сделать, os.rmdir('~/something')чтобы удалить его?
Бакуриу
@Bakuriu В конце концов, я сделал это понять
UniversallyUniqueID

Ответы:

73

Побег ~с \~или использовать одинарные кавычки '~'. так что вы можете

rmdir ~/\~

или же

cd ~ ; rmdir '~'
Марчин Красовский
источник
43
Если вы беспокоитесь об удалении чего-то, что не следует делать, вы можете сначала сделать что-то неразрушающее, например: mv '~' normalname, а затем удалить каталог normalname.
Крис Джефферсон
53
rmdirнеразрушающий. rmdirудалит только пустые каталоги, поэтому, если вы попытаетесь использовать rmdirлюбой каталог, в котором есть что-либо, rmdirон откажется удалить его.
Hitechcomputergeek
3
Вам даже не нужно экранировать тильду в первой из этих команд - ~она раскрывается специально только в начале слова оболочки.
Хеннинг Махолм
1
Вы можете даже просто rmdir *. Так как он удаляет только пустые каталоги, вам не нужно беспокоиться о том, что он сделает что-то разрушительное.
Benubird
@ChrisJefferson: Если вы хотите сначала проверить свою команду, используйте, ls -dчтобы увидеть, содержит ли она каталог или файл, который вам нужен. Не нужно ничего с таким эффектом, как mv.
Питер Кордес
42

Что дает питон, тот забирает:

$ 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

Если вы сделали os.mkdir, вы можете отменить это с os.rmdir(и аналогично для os.makedirsи os.removedirs).

Мур
источник
36

Вы можете либо экранировать имя каталога, используя обратную косую черту, как это (при условии, что вы работаете в родительском каталоге, который вы хотите удалить):

rmdir \~

Или вы можете использовать относительные пути с точкой в ​​качестве текущего каталога (также если он находится в родительском каталоге):

rmdir ./~

Или вы можете использовать полный абсолютный путь:

rmdir /home/USERNAME/~

И не стоит беспокоиться, rmdirможно только удалить пустые каталоги. Если вы случайно наберете команду с ошибкой, а путь к ней будет соответствовать вашему реальному домашнему каталогу, он не представляет опасности, поскольку содержит файлы:

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
Byte Commander
источник
Мне нравится опция относительного пути. Оно должно быть невозможно сопоставить ./~с ~/, независимо от того, в каком каталоге вы находитесь в данный момент в. Аналогичная ситуация с полным абсолютным путем.
MBraedley
2

findКоманда может творить такие чудеса. Команда

ls -i

даст вам номер индекса файлов или каталогов. Затем вы можете использовать findдля удаления таких файлов или каталогов, используя:

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

а также

find . -inum <inode-number> -exec rm -rf {}\; #for directories
user2763554
источник
1

Что должно было быть сделано

Вы должны были выполнить home=os.path.expanduser("~")сначала, а потом os.path.join(home,"something"). Он ~рассматривается как текст в Python и не расширяется, как в bashдругих оболочках.

$ 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/

Как от этого избавиться

В дополнение к уже упомянутым методам, мы можем использовать шестнадцатеричное значение для ~из таблицы символов ascii, которое в отличие от фактического ~не распространяется на домашний каталог пользователя в командной строке (на случай, если вам интересно, когда тильда появляется в начале Одним словом, он расширяется до домашнего каталога пользователя. Сравните ls ~и ls $'\x7e').

Вот как это будет работать:

# 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
Сергей Колодяжный
источник