繁体   English   中英

Bash - 从 ls -la 输出中过滤出目录,但保留目录“.”

[英]Bash - Filter out directories from ls -la output, but leave directory "."

我正在尝试使用 oneliner 计算从./开始的所有文件和子目录的大小:

ls -laR | grep -v "\.\." | awk '{total += $5} END {print total}'

但这会将子目录的大小计算两次,因为ls -laR | grep -v "\\.\\."输出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: as:

drwxr-xr-x 2 root root  4096 Nov 29 22:24 .

我希望,这将发生在每个子目录中。 有没有办法将它们从ls输出中删除一次? Usint grep -v '^d'删除所有目录,因此它们根本不会被计算在内。 我知道我可以简单地使用du -sb来完成它,但我需要用花哨的 oneliner 来完成它。

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}'

用于计算文件夹内容的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM