删除名称中带有连字符的UNIX目录


13

通过笨拙的操作,我意外地创建了一个名为(例如)-A的目录,并最终用文件填充了该目录。

我要删除所述目录。我试过了:

rmdir -- -A

但是它告诉我目录中仍然有文件。而且我不知道如何cd进入目录以删除所说的文件。

我应该怎么做才能摆脱这个麻烦的目录?


5
幸运的是,该目录未命名为“ -rf *”。
user1686

stackoverflowunix上相同。
多里安

Answers:


29

在每个命令上使用-。

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..

11

您可以将./放在文件的前面-那样rm或rmdir不会像文件名是一个选项标志那样工作。

您还可以发出该选项-告诉rm好像其后的所有内容一样-是文件名,并且不应再处理任何选项。也许有些时髦的旧版本rm不能遵守,尽管这些天我的古董unix动物园已经变得很小,所以我无法告诉您哪个版本或者是否有不理解的版本。

无论如何删除,都应该养成在名称前加上./的习惯-您永远不知道目录中是否存在-r或-rf命名文件。您可以说应该始终使用-,但是我发现./更自然,因为它明确表明“我要删除此目录中的文件,而不是*



2

rmdir不会删除其中包含任何内容的目录。“ rm -rf”将。rmdir比“ rm -rf”安全得多。Moo的答案可能仍然是最好的。



0

另一种方法是通过inode删除(这适用于具有其他字符的文件/目录,而仅使用rm很难删除)。

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$

rm仍将在命令行中传递-A参数,并且仍会尝试将其解释为一个选项,因此您仍然需要防止它以某种方式(通过双破折号或在。前面放置./)来看到前划线。名称的其余部分
克里斯(Chris)2009年

由于您是从“。”中查找,因此查找将自动在该查找之前。传入的文件名将为“ ./-A”,或可能被称为“ ./-A”的任何文件,并以./开头并为命令正确转义。
baumgart

Nit:-exec不会逃避名称,也不需要;通过exec*系统调用之一传递的参数是实际名称。只有shell输入需要特殊的字符(如空格,分号星号等)才能使shell传递正确的(用引号引起来)实际名称。也就是说,find -exec rm -f {}仅适用于文件,不适用于此Q要求的目录;find -exec rm -rf {}确实可以处理目录,甚至可以处理非空目录,但是跳过find并执行rm -rf ./-A操作要简单得多。
dave_thompson_085

0

find可以通过以下方式删除目录:

find . -type d -iname '-A' -delete

-1

我试图删除名为的目录-p。@Moo的答案达到了我无法做到的目标rm ./-p,在Google搜索之后,它可以在许多网页上广泛使用。

另一种方法是使用索引节点号。我使用这里描述的方法:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

简而言之,使用以下命令:

  1. 显示文件或目录的索引节点号。
ls -il
  1. 对文件或目录find使用-exec rm -irf带有参数的命令-exec rm -ifdr
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

确保使用-f标志内的,否则bash会抱怨找不到目录或文件。

经过测试:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

1
这几乎是10年前baumgart的回答的重复,但是从调用时您rm -d永远不需要,通常也不需要,但是您确实需要目录并且不需要文件。即使校正后,此方法仍然笨拙且不合格。对于非空目录,只需执行-这是目录的r,然后f取决于权限设置。-ffind-rrm -fr ./-p
dave_thompson_085

1
先前的答案中已经提到了这两种方法。
RalfFriedl
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.