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

46

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

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

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

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

    
задан UniversallyUniqueID 07.04.2016 в 17:34
источник

5 ответов

73

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

rmdir ~/\~

или

cd ~ ; rmdir '~'
    
ответ дан Marcin Krasowski 07.04.2016 в 17:37
источник
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 ).

    
ответ дан muru 07.04.2016 в 17:43
35

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

rmdir \~

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

rmdir ./~

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

rmdir /home/USERNAME/~

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

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
    
ответ дан Byte Commander 07.04.2016 в 17:59
2
Команда

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

ls -i

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

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

и

find . -inum <inode-number> -exec rm -rf {}\; #for directories
    
ответ дан user2763554 11.04.2016 в 06:27
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
    
ответ дан Sergiy Kolodyazhnyy 13.07.2017 в 05:09