参考链接...微软在 Windows 上的 attrib 命令。
该选项的描述/d
...“将 attrib 和任何命令行选项应用于目录。”
attrib
不带路径使用时,仅打印当前目录中文件的属性。attrib
不带路径使用时,该/d
选项似乎意味着“除了文件外,还对目录执行此操作”,而这并不是我从描述中得到的理解,/d
所以我不确定描述是否不足,或者这是否应该是显而易见的。我知道文件和目录在 Windows 中是不同的(但在 Linux 中,目录是文件类的子类)。
通过使用只读属性进行测试+r
,-r
我得出了一些观察结果......
attrib prints attributes for files in the current directory
attrib /d prints attributes for files and directories in the current directory
attrib +r /s /d dir sets the attributes for the directory not recursively
attrib +r /s /d dir\* sets the attributes for files and directories recursively
attrib +r /s /d * sets attribs for files and dirs in current dir and recursively
该选项的描述/s
是……“将 attrib 和任何命令行选项应用于当前目录及其所有子目录中的匹配文件。”由于没有提到递归,也许应该预期第 3、4 和 5 个命令不应该递归,但在测试中我们可以证明递归是可能的。存在文档问题……对“其所有子目录”进行操作与递归不同,递归被理解为所有级别子目录。
为什么第三个例子还不是递归的?在我看来,第三个例子是第五个例子的子集。
答案1
attrib
以某种非常规的方式处理路径参数。与大多数现代工具不同,它不会简单地使用给定的路径作为开始递归的根 - 而是将路径分成两部分(目录和基本名称),然后“目录”部分成为递归搜索的起点,而“基本名称”用作筛选获取搜索结果。
因此,虽然第三个例子(attrib /s /d dir
)是递归的,它并不意味着“以递归方式搜索目录dir
中的所有对象”(大多数人都这么认为)——相反,它的意思是“以递归方式搜索当前目录中名为 的对象dir
”。递归搜索只会找到一个结果 ( .\dir
)。
另一方面,attrib /s /d foo\*
处理方式如下dir="foo", match="*"
,它从当前目录开始搜索foo
并查找与名称匹配的任何子目录*
。
dir
Cmd.exe 中的内置命令以相同的方式运行。例如,如果你输入;dir /s foo
它可能会输出one\two\three\foo
。