Linux rm 如何删除 - 开头的文件

平时执行脚本的过程中,由于脚本编写问题,多多少少会遇到无故出现一些特殊字符开头的文件或文件夹。由于很多特殊字符具有通配符的作用,所以直接 rm -rf 的风险很大,虽然用 tab 补全可以规避一些风险,但是一般来说,我都是新建一个正常命名的文件夹,把特殊文件用 tab 补全的方式 mv 进去并确认后,再把整个文件夹删掉。

但是今天遇到了一个字符 - 开头的文件夹,用 tab 的方式补全后,无法正常识别,即使在 - 前面加 \ 转义也不行。

1
2
3
4
5
6
7
8
[root@ECPMINI tmp]# mv -o/ test/
mv: invalid option -- 'o'
Try `mv --help' for more information.
[root@ECPMINI tmp]#
[root@ECPMINI tmp]# mv \-o/ test/
mv: invalid option -- 'o'
Try `mv --help' for more information.
[root@ECPMINI tmp]#

不止 mv ,连 cpcdls 之类的命令对于这个 - 开头的文件都无可奈何。

由于其他命令的 help 文件内容很少,所以一直查到 rm --help ,才真相大白:

1
2
3
4
5
6
7
8
[root@ECPMINI tmp]# rm --help
...
To remove a file whose name starts with a `-', for example `-foo',
use one of these commands:
rm -- -foo

rm ./-foo
...

原来由于 - 是参数符号,所以很多命令在操作 - 开头的文件或文件夹时,会把文件名识别成参数,造成参数错误的情况。为了针对这种情况,在操作这些文件或文件夹时,在文件名前加上 -- ,才能把文件名的 - 给转义掉。这种方式不止用于 rm ,在其他基础操作中也是可行的。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ECPMINI tmp]# ls
-o test
[root@ECPMINI tmp]# ls -- -o
123.txt
[root@ECPMINI tmp]# mv -- -o test/
[root@ECPMINI tmp]# rm -r test/
rm: descend into directory `test'? y
rm: descend into directory `test/-o'? y
rm: remove regular empty file `test/-o/123.txt'? y
rm: remove directory `test/-o'? y
rm: remove directory `test'? y
[root@ECPMINI tmp]# ls
[root@ECPMINI tmp]#

最后,顺利解决了 - 开头的文件或文件夹无法操作的问题。