如何过滤 du 输出?

如何过滤 du 输出?

那么它就不会显示包含我用作标志的名为“0k”的空文件的目录吗?似乎--exclude无法解决这个问题。

答案1

du可以从 stdin 接受文件或目录列表(或者足够新的版本可以)。因此,您可以使用find和朋友来过滤并提供此列表:

find Pictures -mindepth 2 -type d \( -execdir test -f '{}/0k' \; -o -print0 \) |
  du --files0-from=- -h
  • 使用-mindepth 2,将仅列出深度至少为两层的find目录 ( ) (因此)-type dPictures/*/*
  • 在每个目录中,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

答案2

如果您的空文件充当标志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

答案3

#!/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}"

答案4

如果要排除的每一行都包含某个字符串(例如文件名),那么您可以使用 来grep过滤结果du

用法如下:du | grep -v -e "string_to_exclude"-v的参数grep反转输出,以便仅显示不匹配的内容。

相关内容