我正在尝试使用oneliner计算从./
开始的所有文件和子目录的大小:
ls -laR | grep -v "\.\." | awk '{total += $5} END {print total}'
但这会计算两次子目录的大小,因为ls -laR | grep -v "\.\."
的输出是:
.:
total 32
drwxr-xr-x 3 root root 4096 Nov 29 22:59 .
-rw-r--r-- 1 root root 55 Nov 29 02:19 131
-rw-r--r-- 1 root root 50 Nov 29 01:28 abc
-rw-r--r-- 1 root root 1000 Nov 29 01:27 access.log
drwxr-xr-x 2 root root 4096 Nov 29 22:24 asd
-rwx------ 1 root root 458 Nov 29 02:54 oneliners.sh
-rwx------ 1 root root 2136 Nov 29 17:56 regexp.sh.skript
./asd:
total 32
drwxr-xr-x 2 root root 4096 Nov 29 22:24 .
-rw-r--r-- 1 root root 21298 Nov 29 22:26 asd
因此它将目录asd计算两次。在目录.:
的列表中列为:
drwxr-xr-x 2 root root 4096 Nov 29 22:24 asd
和第二次列出目录./asd:
:
drwxr-xr-x 2 root root 4096 Nov 29 22:24 .
我希望,每个子目录都会发生这种情况。有没有办法从ls
输出中删除它们一次? Usint grep -v '^d'
删除所有目录,因此它们根本不会被计算在内。我知道我可以使用du -sb
来完成它,但我需要用花哨的oneliner完成它。
答案 0 :(得分:0)
ls -FlaR |grep -v '\s\.\{1,\}/$' |awk '{total += $5} END {print total}'
包含'。'中文件夹的大小,但不包括'。'的大小。本身。与du相比,答案是完全不同的 - 其中du是关于磁盘上的空间(与块相关)。 我使用你的awk脚本得到的答案更接近操作系统报告的内容 - 如果你减去你得到匹配的目录大小,这表明MacOS X使用类似于
的方法ls -FlaR |grep -v '^d.*/$' |awk '{total += $5} END {print total}'
用于计算文件夹内容的大小。