为什么`du -sh *` 会抱怨选项无效?

jmk*_*ane 8 options disk-usage shell-script wildcards

我已经通过谷歌搜索了我最好的,但在我的生活中,我无法弄清楚*在最近的更新后使用什么来代替(星号)(甚至维基百科似乎认为

du -sh * and du -sh * 应该管用)

我用过

du -sh * | sort -h

自从 sort 得到这个-h选项之前(我认为在 Fedora 上,我花了一段时间才可以sort -h在 CentOS 上使用),但突然 * 似乎输出了一长串

du: invalid option -- ' '
Run Code Online (Sandbox Code Playgroud)

其中' '遍历手册页中未提及的所有无效选项。

如果有人能告诉我什么相当于

du -sh * | sort -h

在更新的版本上。

der*_*ert 16

您有一个名称很有趣的文件,可能以-. 请记住,全局变量(如*)由您的 shell 展开,而不是由正在运行的命令展开。例如,假设您有:

$ ls -1
foo
-q
Run Code Online (Sandbox Code Playgroud)

足够简单的目录,里面有两个文件。(-1coreutils的选项ls使其输出单列。)

当您运行 时du -sh *,shell 会注意到第二个参数包含一个特殊字符 ( *) 并且没有被引用,因此它会进行 glob 扩展。它将它扩展到匹配的所有内容,在本例中为foo-q。效果就像你运行一样:

$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.
Run Code Online (Sandbox Code Playgroud)

上面的错误很明显:为了方便,GNU 实用程序允许选项与文件名混合;du正在将文件名-q作为选项。而且没有-q选择。(这实际上是您所能期望的最好结果;如果有-q选择的话,情况会更糟,而且它做了一些不需要的事情。)

Stépahane 的建议是将您的 glob 更改为./*,这将导致du -sh ./foo ./-q- 这当然被视为文件名,因为它不再以-. 他建议的另一个选项是使用--,它告诉 GNU 实用程序没有更多选项——只有文件/目录名称。

真的,您应该始终使用… ./*… -- *代替*,但我们都很懒惰...... 请小心,特别是如果您不信任所有文件名。