Випадково створений каталог з назвою "~" (tilde)


47

Мені вдалося зробити каталог, буквально названий ~.

(Мабуть, так os.mkdir('~/something')робить і Python .)

Як її видалити, не зануривши будинок?

Крім того, якщо це допомагає, я маю свою справжню /homeна окремому розділі. А дублікат ~знаходиться в ( справжньому ) ~.


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

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

2

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

ls -i

дасть вам кількість номерів файлів чи каталогів. Потім ви можете використовувати findдля видалення таких файлів або каталогів за допомогою:

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

і

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.