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


Мне удалось создать каталог буквально названный ~,

(По-видимому, Python's os.mkdir('~/something') Является ли это.)

Как удалить его, не нажимая мой дом?

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


46
2018-04-07 15:34


Источник


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


Ответы:


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

rmdir ~/\~

или

cd ~ ; rmdir '~'

73
2018-04-07 15:37



Если вы беспокоитесь об удалении чего-то, чего вы не должны, вы можете сначала сделать что-то неразрушающее, например: mv '~' normalname, а затем удалить нормальное имя каталога. - Chris Jefferson
rmdir является неразрушающим. rmdir будут удалять только пустые каталоги, поэтому, если вы попытаетесь rmdir любой каталог, в котором есть что-то вообще, rmdir откажется удалить его. - Hitechcomputergeek
Вам даже не нужно избегать тильды в первой из этих команд - ~ расширяется специально только в начале оболочки «слово». - Henning Makholm
Вы даже можете просто rmdir *, Поскольку он удаляет только пустые каталоги, вам не нужно беспокоиться о том, что это делает что-то разрушительное. - Benubird
@ChrisJefferson: Если вы хотите сначала проверить свою команду, используйте ls -d чтобы узнать, содержит ли он каталог или файл, который вы хотите. Не нужно ничего с эффектом mv, - Peter Cordes


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

$ 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).


42
2018-04-07 15:43





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

rmdir \~

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

rmdir ./~

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

rmdir /home/USERNAME/~

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

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty

35
2018-04-07 15:59



Мне нравится опция относительного пути. Невозможно сопоставить ./~ в ~/, независимо от того, в каком каталоге вы находитесь. Аналогичная ситуация с полным абсолютным путем. - MBraedley


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

ls -i

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

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

а также

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

2
2018-04-11 04:27





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

Вы должны были выполнить 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

1
2017-07-13 03:09