为什么 coreutils 命令中没有ls
像 MS-DOS/Windows 那样的摘要选项?
对于摘要选项,我的意思是:
计算文件和目录并总结他们的尺寸。
更新:
其内容应为:“甚至DOS/Windows 有一个。”
它是:
command.com vs. sh
cmd.exe vs. bash
后者有明确的要点。
但出于某种原因,这就是问题所在,Linux/Unix 已经没有总结在目录列表中。
而不是解决这个问题,而是声明这是正确的,是正确的事情,并且“干得好”......只有在那之后,线程才会爆发出通过脚本来修复这个空缺的解决方案!
在我看来,这是一个很好的例子XY问题:
- 用户想做 X。
- 用户不知道如何做 X,但认为如果他们能够设法做 Y,他们就可以摸索找到解决方案。
- 用户也不知道如何做 Y。
- 用户请求有关 Y 的帮助。
- 其他人尝试帮助用户解决 Y 问题,但感到困惑,因为 Y 似乎是一个需要解决的奇怪问题。
- 经过大量交互和浪费时间后,最终清楚用户确实需要 X 方面的帮助,而 Y 是一个死胡同。
想象一下以下情况:
你坐在餐厅里,服务员送来账单。他列出了所有菜品,却没有总结!你必须自己做——他已经“做得很好”了。
或者他没有?
结束语:
当然知道我 - 并且喜欢 -UNIX工具包。但基本功能应该由工具本身提供。在正确的位置添加几个数字,尤其是在如此急需的情况下,这根本不是问题。我认为没有理由不这样做。
结论:
我现在的理解是:POSIX!
这POSIX标准没有提及摘要。就是这样。
它是刻在石头上的。
人们根本不去想X。他们是用过的去处理是。
然而,令人惊讶的是,我们完全忽视了这种情况的可能性。
答案1
但基本功能应该由工具本身提供。
这是对的。 UNIX/Linux 的哲学是拥有只做一件事的命令/工具,并且把那件事做得非常好。然后,一个命令的标准输出通过管道馈送到另一个命令的标准输入,以产生复杂的结果。
从其联机帮助页来看,该命令的目的ls
是“列出有关文件的信息”。它能够生成包含或排除模式的列表,按不同标准排序,显示不同信息等,但仅此而已。计算一组文件的总大小不是ls
的职责。事实上,正是如此du
。该du
命令(同样来自其联机帮助页)是一个“总结文件集的磁盘使用情况”的工具。
所以,这可能不是您正在寻找的答案,但是ls
行为如下由 UNIX 设计。我可能会补充说,这种设计几十年来已被证明是有效的。
另一方面,正如我所注意到的,Windows 的哲学是不同的。在我看来,它的目标是为用户提供一些通用工具,可以完成所有事情,也许是为了不让(没有经验的)用户学习太多命令。
答案2
du
是总结文件和目录使用情况的强大命令。看https://superuser.com/questions/162749/how-to-get-the-summarized-sizes-of-directories-and-their-subdirectories。
例如du -sh *
查看每个文件夹的大小。添加该-c
选项du -csh *
会在最后给出总计。
可以通过将 ls 输出通过管道传输到 来找到文件计数wc
,如下所示ls | wc -l
。
无论您想做什么,我相信 Linux 中都有办法。它可能与您在 DOS/Windows 中习惯的不同,但一般来说 Linux 在您可以实现的功能方面要灵活得多。
答案3
嗯,有一个 unix/linux 实用程序可以生成输出相似的 到dir
输出DOS
(我正在使用镜头此页面作为参考因为我现在无法访问 Windows 机器):
它可以列出当前目录的内容以及摘要类似于DOS使用以下开关:
-i
-- 不打印缩进线
-L 1
-- 将深度级别设置为 1
--du
-- 将每个目录大小报告为其所有文件和子目录(及其文件等,只要不被拒绝)大小的累积通过 ) 下降到相应的子目录中-L
。最终报告中还给出了已用空间的总量。
--timefmt '%D %T'
-- 根据格式字符串打印并格式化日期%D %T
所以运行例如
tree -i -L 1 --du --timefmt '%D %T'
印刷
[ 8499420 12/05/22 21:38:20] .
[ 2028626 12/28/21 13:24:00] 02.jpg
[ 4907520 11/08/22 01:54:10] 03.JPG
[ 4096 12/05/22 17:38:54] 05-dir
[ 465991 11/01/22 21:46:33] 08.jpg
[ 418149 11/01/22 21:46:33] 09.jpg
[ 4096 11/28/22 20:42:09] 11-dir
[ 583732 10/16/22 21:34:43] 16.png
[ 83114 02/20/22 23:01:49] 19.jpg
8499420 bytes used in 2 directories, 6 files
现在...有一些区别:
首先,据我所知,没有办法<DIR>
在没有后处理的情况下打印目录...不过,如果设置了环境变量并且输出为; ,tree
那么目录将具有不同的颜色;无论哪种方式,都可以使用不同的颜色,例如,这就是我的设置中的样子(这次以人类可读的格式添加到打印尺寸):LS_COLORS
tty
TREE_COLORS
-h
TREE_COLORS="di=1;32" tree -i -L 1 --du --timefmt '%D %T' -h
请注意,还有-F
与使用时相同的功能,ls
例如,它附加一个 /
用于目录,一个=
用于套接字文件,一个*
用于可执行文件等等(有关此内容和其他内容的详细信息,例如对文件进行排序的各种方式,请参阅手册,显示隐藏文件等)
其次,tree
以不同的顺序打印列:首先是大小,然后是日期,然后是文件名。同样,如果没有后处理,就无法更改列的顺序。从 v.1.7 开始,tree
可以输出 JSON - 您可以将该 JSON 输出通过管道传输到例如jq
并重新排列所有内容,使其与 DOS 对应部分几乎相同,但这超出了本文的范围,即“工具本身提供的基本功能”