Случайно созданный каталог, названный “~” (тильда)

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

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

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

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

53
задан 10 April 2016 в 12:05

5 ответов

Закройте ~ с помощью \ ~ или используйте одинарные кавычки '~' . так что вы можете

rmdir ~/\~

или

cd ~ ; rmdir '~'
74
ответ дан 22 November 2019 в 23:54

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

$ 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
ответ дан 22 November 2019 в 23:54

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

rmdir \~

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

rmdir ./~

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

rmdir /home/USERNAME/~

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

$ rmdir directory_with_files
rmdir: failed to remove ‘directory_with_files’: Directory not empty
36
ответ дан 22 November 2019 в 23:54
Команда

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

ls -i

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

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

и

find . -inum <inode-number> -exec rm -rf {}\; #for directories
2
ответ дан 22 November 2019 в 23:54

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

Вы должны были выполнить home = os.path.expanduser ("~") сначала, а затем os.path.join (home, "что-то") . ~ рассматривается как текст в 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
ответ дан 22 November 2019 в 23:54

Другие вопросы по тегам:

Похожие вопросы: