当存在以连字符开头的文件时,为什么“rm *”不起作用?

当存在以连字符开头的文件时,为什么“rm *”不起作用?

从:http://seclists.org/fulldisclosure/2011/Sep/190

[USER@MACHINE ~] mkdir ejha
[USER@MACHINE ~] cd ejha/
[USER@MACHINE ~/ejha] touch ize
[USER@MACHINE ~/ejha] touch -- -f -i
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 ize
[USER@MACHINE ~/ejha] rm *
rm: remove regular empty file `ize'? y
[USER@MACHINE ~/ejha] ls -l
total 0
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -f
-rw-rw-r--. 1 USER USER 0 Sep 20 19:44 -i
[USER@MACHINE ~/ejha] 

有关系统的信息:

[USER@MACHINE ~/ejha] echo $SHELL
/bin/bash
[USER@MACHINE ~/ejha] lsb_release -a
LSB Version:    :core-4.0-ia32:core-4.0-noarch
Distributor ID: Fedora
Description:    Fedora release 14 (Laughlin)
Release:    14
Codename:   Laughlin
[USER@MACHINE ~/ejha] rpm -qa | fgrep bash
bash-4.1.7-4.fc14.i686
[USER@MACHINE ~/ejha] 

为什么?为什么它不删除“-f”和“-i”文件?

答案1

它不会删除它们,因为它将文件名识别为参数(不带引号,在这种情况下*扩展为-f -i ize)。要删除这些文件,请执行rm -- *、 或rm ./*--表示参数结束,./使用当前目录的链接来绕过rm的参数检测。

通常./*是更可取的,因为某些程序不接受--停止检查参数。

这不是一个错误。应通过rm以正确的方式调用来处理此问题,以避免此类问题。

答案2

只是为了增加一点清晰度,“*”是由您的 shell 扩展的,而不是由“rm”扩展的,因此“rm”命令只是获取文件列表作为参数。因此,在您的示例中,“rm *”与输入“rm -f -i ize”完全相同。

在其他系统(例如,Windows/DOS 命令行)中,“*”通过命令本身扩展为文件列表,因此命令“知道”所有匹配的文件都是文件。这种方法的缺点是每个命令都需要实现通配符并重新实现通配符配置和引用规则等。

相关内容