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

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

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

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

我用过

du -sh * | sort -h

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

du: invalid option -- ' '

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

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

du -sh * | sort -h

关于更新的版本。

答案1

您有一个具有有趣名称的文件,可能以-.请记住,glob(如*)是由您的 shell 扩展的,不是正在运行的命令。举个例子,假设您有:

$ ls -1
foo
-q

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

当您运行时du -sh *,shell 会注意到第二个参数包含特殊字符 ( *) 并且未加引号,因此它会进行全局扩展。它将其扩展到所有匹配的内容,在本例中foo为 和-q。效果与您运行的效果完全相同:

$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.

上面的错误很明显:为了方便起见,GNU 实用程序允许选项与文件名混合;du将文件名-q作为选项。并且没有-q选择。 (这实际上是您可以期望的最好的结果;如果有一个-q选项,并且它做了一些不需要的事情,那就更糟糕了。)

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

真的你应该总是使用… ./*… -- *代替*,但我们都很懒……。请小心,尤其是当您不信任所有文件名时。

答案2

du 正在使用文件中的破折号并将其作为参数。

如果将“--”传递给命令,则表示不会发送更多选项,因此请像这样运行命令:du -fh -- * 或 du -sh -- *

为我工作...

该线程有帮助:-http://www.webhostingtalk.com/showthread.php?t=1354139

相关内容