意外创建的目录名为“〜”(波浪号)


47

我设法让一个目录字面上命名~

(显然,Python是os.mkdir('~/something')这样做的。)

如何在不破坏我的家的情况下将其删除?

另外,如果有帮助,我可以将我的真实账户/home放在一个单独的分区上。并且副本~位于(real)中~


51
强制性XKCD。好的,我可能对它的强制性撒了谎。并成为XKCD。
Jesvin Jose

30
要回答您以后没有问过的Python问题,请使用os.mkdir(os.path.expanduser('~/something'))
马特·诺德霍夫

8
...只是出于好奇,因为您是在python中创建目录的,所以您不想os.rmdir('~/something')删除它吗?
巴库里

@Bakuriu最终,我确实知道了这一点
UniversallyUniqueID

Answers:


73

~\~或转义单引号'~'。所以你可以

rmdir ~/\~

要么

cd ~ ; rmdir '~'

43
如果您担心删除不应该删除的内容,则可以先执行非破坏性的操作,例如:mv'〜'normalname,然后删除目录normalname。
克里斯·杰斐逊

53
rmdir是非破坏性的。rmdir只会删除空目录,因此,如果您尝试访问其中rmdir没有任何内容的目录,rmdir则将拒绝删除它。
Hitechcomputergeek

3
您甚至不需要在这些命令中的第一个转义波浪号- ~仅在shell“单词”的开头专门进行扩展。
Henning Makholm '16

1
你甚至可以rmdir *。由于它仅删除空目录,因此您无需担心它会造成破坏性的影响。
Benubird

@ChrisJefferson:如果要首先检查命令,请使用ls -d它来查看它是否列出了您想要的目录或文件。不需要任何具有效果的东西mv
彼得·科德斯

42

python给了什么,python带走了:

$ 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.makedirsos.removedirs)。


36

您可以使用这样的反斜杠对目录名称进行转义(假设您在要删除的目录的父目录中进行操作):

rmdir \~

或者,您可以使用带点的相对路径作为当前目录(也位于父目录中):

rmdir ./~

或者,您可以使用完整的绝对路径:

rmdir /home/USERNAME/~

不用担心,rmdir只能删除空目录。如果您不小心键入了错误的命令,并且该路径会求值到您的真实主目录,则它没有危险,因为它包含文件:

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

我喜欢相对路径选项。无论您当前处于哪个目录,都应该不可能映射./~~/。具有完全绝对路径的类似情况。
MBraedley '16

2

find命令可以做到这样的奇迹。命令

ls -i

将为您提供文件或目录的inode数量。然后,您可以使用以下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字符表中的hex值,这与实际的不同,它~不会在命令行上扩展到用户的主目录(如果您想知道,波浪号何时出现在一句话,它扩展为用户的主目录。比较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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.