所以,在许多情况下,我想要知道我的磁盘空间有多less被使用,所以我知道该如何去除,转换成其他格式,存储在别处(如数据DVD),移动到另一个分区,在这种情况下,我正在从SliTaz Linux可启动媒体看Windows分区。
在大多数情况下,我想要的是文件和文件夹的大小,为此我使用基于NCurses的ncdu :
但在这种情况下,我想要一个方法来获得匹配正则expression式的所有文件的大小。 .bak文件的示例正则expression式:
.*\.bak$
考虑一个具有核心GNU工具或BusyBox的标准Linux,我如何得到这些信息?
编辑:输出是打算由脚本parsing。
我建议像这样: find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1
find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1
一些说明:
-print0
和--files0-from
for的-print0
选项可以避免文件名中的空白问题 ./dir1/subdir2/file.bak
,而不仅仅是file.bak
,所以如果你修改它,考虑到这一点 k
(总是使用千字节) tail
命令,您将另外看到特定文件和目录的大小 旁注:一个很好的图形用户界面工具,找出谁吃了你的磁盘空间是FileLight 。 它不会执行正则表达式,但是对于查找堵塞磁盘的大目录或文件非常方便。
du
是我最喜欢的答案。 如果你有一个固定的文件系统结构,你可以使用:
du -hc *.bak
如果您需要添加子目录,只需添加:
du -hc *.bak **/*.bak **/**/*.bak
等等
但是,这不是一个非常有用的命令,所以使用你的find:
TOTAL=0;for I in $(find . -name \*.bak); do TOTAL=$((TOTAL+$(du $I | awk '{print $1}'))); done; echo $TOTAL
这将回显您找到的所有文件的总字节数。
希望有所帮助。
在Bourne Shell中运行以声明一个函数,该函数可计算当前目录中与正则表达式模式匹配的所有文件的大小总和:
sizeofregex() { IFS=$'\n'; for x in $(find . -regex "$1" 2> /dev/null); do du -sk "$x" | cut -f1; done | awk '{s+=$1} END {print s}' | sed 's/^$/0/'; unset IFS; }
(或者,你可以把它放在脚本中。)
用法:
cd /where/to/look sizeofregex 'myregex'
结果将是一个数字(以KiB为单位),包括0
(如果没有与您的正则表达式匹配的文件)。
如果你不希望它在其他文件系统中查找(比如说你想查找/
下的所有.so
文件,这是/dev/sda1
的挂载,而不是在/home
下挂载/dev/sdb1
,在上面的函数中添加一个-xdev
参数。
以前的解决方案不适合我(我有麻烦管道du
),但以下工作很好:
find path/to/directory -iregex ".*\.bak$" -exec du -csh '{}' + | tail -1
iregex
选项是不区分大小写的正则表达式。 使用regex
如果你想它是区分大小写的。
如果您对正则表达式不熟悉,则可以使用iname
或name
标志(前者不区分大小写):
find path/to/directory -iname "*.bak" -exec du -csh '{}' + | tail -1
如果你想要每个匹配的大小(而不仅仅是总和),只需要省略piped tail命令:
find path/to/directory -iname "*.bak" -exec du -csh '{}' +
这些方法避免@MaddHackers的答案中的子目录问题。
希望这可以帮助其他人在相同的情况下(在我的情况下,在.NET解决方案中找到所有DLL的大小)。
如果你可以用glob模式,你只对当前目录感兴趣:
stat -c "%s" *.bak | awk '{sum += $1} END {print sum}'
要么
sum=0 while read size; do (( sum += size )); done < <(stat -c "%s" *.bak) echo $sum
统计的%s
指令给出的字节不是千字节。
如果你想下载到子目录,使用bash版本4,你可以shopt -s globstar
并使用**/*.bak
shopt -s globstar
模式
接受的答复建议使用
find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1
但是这在我的系统上不起作用,因为du
不知道我系统上的--files-0-from
选项。 只有GNU du
知道这个选项,它不是POSIX标准的一部分(所以你不会在FreeBSD或macOS上找到它),也不会在基于BusyBox的Linux系统 (例如大多数嵌入式Linux系统)或任何其他Linux系统那不使用GNU du
版本。
然后有一个回复建议使用:
find path/to/directory -iregex .*\.bak$ -exec du -csh '{}' + | tail -1
只要没有找到太多的文件,这个解决方案就可以工作,因为+
意味着find
将在一次调用中尝试调用du
尽可能多的命中,但是,可能有最大数量的参数(N)a系统支持,如果有比这个值更多的命中, find
将多次调用du
,将命中分成小于或等于N个项目的组,这种情况下结果将是错误的,只显示最后一个du
呼叫的大小。
最后,有一个使用stat
和awk
的答案,这是一个很好的方法,但是它依赖于shell的通配符,只有Bash 4.x或更高版本支持。 它不适用于旧版本,如果它与其他shell的工作是不可预知的。
符合POSIX标准的解决方案(适用于Linux,macOS和任何BSD变体),不受任何限制,并且肯定可以与每个shell一起工作:
find . -regex '.*\.bak' -exec stat -f "%z" {} \; | awk '{s += $1} END {print s}'