useful Asked: 2017-07-13 00:55:24 +0800 CST2017-07-13 00:55:24 +0800 CST 2017-07-13 00:55:24 +0800 CST 如何过滤du输出? 772 这样它就不会显示包含我用作标志的名为“0k”的空文件的目录?好像--exclude没办法处理。 command-line 4 个回答 Voted Best Answer muru 2017-07-25T00:06:23+08:002017-07-25T00:06:23+08:00 du可以接受来自标准输入的文件或目录列表(或者足够新的版本,无论如何)。因此,您可以使用find和朋友来过滤并提供此列表: find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) | du --files0-from=- -h 使用-mindepth 2,find只会列出目录 ( -type d) 至少两层深 (so Pictures/*/*) 在这些目录中的每一个中,find都会运行test -f "{}/0k",它只是测试是否存在名为0k. ({}将被替换find为目录。) 如果测试成功,则不会发生任何事情。如果不是,则在目录路径的末尾打印一个 ASCII NUL ( -o print0)。 这种方式-o有效,execdir和-print0需要使用(,进行分组)。 du然后将采用这些目录名称并愉快地提供磁盘使用情况。 排序: find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) | du --files0-from=- -h | sort -rh Arronical 2017-07-13T03:57:08+08:002017-07-13T03:57:08+08:00 如果调用了充当标志的空文件0k,则以下命令将读取当前目录中不包含该文件的所有子目录。您当然可以.将循环开头的更改for为任何目录路径。 for dir in ./*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done 你没有在你的问题中提到你是否需要完全递归,如果是这样,它会稍微复杂一些。这里可以使用find命令,搜索目录可以如上改变: find . -type d -exec bash -c 'if [[ ! -f "{}"/"0k" empty ]]; then du -s "{}"; fi' \; 编辑:从 OP 澄清任务后,以下命令应该可以工作。 for dir in Pictures/*/*; do if [[ ! -f "$dir"/'0k' ]]; then du -s "$dir" ; fi ; done | sort -nr | head -n50 useful 2017-07-24T23:36:26+08:002017-07-24T23:36:26+08:00 #!/bin/bash # Vars NumLines="5" # output that many/few lines MinSize=0 # filter out size folders lower than (MB) while read DUout do # get folder size Size="${DUout%%[[:space:]]*}" # get folder path Path="/${DUout#*/}" # Filter out if no 0k flagfile inside [[ ! -f "${Path}/0k" ]] && echo "${DUout}"|cut -d"/" -f1,5-6 done < <(du -s -t${MinSize}M "${PWD}"/????/??????\ * | sort -nr) | head -"${NumLines}" Brendon Boldt 2017-07-13T01:32:16+08:002017-07-13T01:32:16+08:00 如果您要排除的每一行都包含某个字符串(例如,文件名),那么您可以grep使用du. 这将被这样使用:du | grep -v -e "string_to_exclude". 的-v参数grep反转输出,以便只显示不匹配的内容。
du
可以接受来自标准输入的文件或目录列表(或者足够新的版本,无论如何)。因此,您可以使用find
和朋友来过滤并提供此列表:-mindepth 2
,find
只会列出目录 (-type d
) 至少两层深 (soPictures/*/*
)find
都会运行test -f "{}/0k"
,它只是测试是否存在名为0k
. ({}
将被替换find
为目录。)-o print0
)。-o
有效,execdir
和-print0
需要使用(
,进行分组)
。du
然后将采用这些目录名称并愉快地提供磁盘使用情况。排序:
如果调用了充当标志的空文件
0k
,则以下命令将读取当前目录中不包含该文件的所有子目录。您当然可以.
将循环开头的更改for
为任何目录路径。你没有在你的问题中提到你是否需要完全递归,如果是这样,它会稍微复杂一些。这里可以使用find命令,搜索目录可以如上改变:
编辑:从 OP 澄清任务后,以下命令应该可以工作。
如果您要排除的每一行都包含某个字符串(例如,文件名),那么您可以
grep
使用du
.这将被这样使用:
du | grep -v -e "string_to_exclude"
. 的-v
参数grep
反转输出,以便只显示不匹配的内容。