Bash - 从ls -la输出中过滤掉目录,但是保留目录"。"

时间:2015-11-29 22:21:17

标签: linux bash shell

我正在尝试使用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完成它。

1 个答案:

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

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