在Linux下,名称与正则expression式匹配的文件的磁盘使用情况?

所以,在许多情况下,我想要知道我的磁盘空间有多less被使用,所以我知道该如何去除,转换成其他格式,存储在别处(如数据DVD),移动到另一个分区,在这种情况下,我正在从SliTaz Linux可启动媒体看Windows分区。

在大多数情况下,我想要的是文件文件夹的大小,为此我使用基于NCurses的ncdu :

ncdu

但在这种情况下,我想要一个方法来获得匹配正则expression式所有文件的大小。 .bak文件的示例正则expression式:

.*\.bak$ 

考虑一个具有核心GNU工具或BusyBox的标准Linux,我如何得到这些信息?

编辑:输出是打算由脚本parsing。

Solutions Collecting From Web of "在Linux下,名称与正则expression式匹配的文件的磁盘使用情况?"

我建议像这样: 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 ,所以如果你修改它,考虑到这一点
  • 我用du标志来产生一个“人类可读的”格式,但是如果你想解析输出,你可能会比较好用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如果你想它是区分大小写的。

如果您对正则表达式不熟悉,则可以使用inamename标志(前者不区分大小写):

 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呼叫的大小。

最后,有一个使用statawk的答案,这是一个很好的方法,但是它依赖于shell的通配符,只有Bash 4.x或更高版本支持。 它不适用于旧版本,如果它与其他shell的工作是不可预知的。

符合POSIX标准的解决方案(适用于Linux,macOS和任何BSD变体),不受任何限制,并且肯定可以与每个shell一起工作:

 find . -regex '.*\.bak' -exec stat -f "%z" {} \; | awk '{s += $1} END {print s}'