那么它就不会显示包含我用作标志的名为“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 d
Pictures/*/*
- 在每个目录中,
find
将运行test -f "{}/0k"
,它只是测试名为的文件是否存在0k
。({}
将被替换find
为目录。)- 如果测试成功,则不会发生任何事情。如果失败,则目录路径末尾会打印一个 ASCII NUL (
-o print0
)。 - 该方式
-o
有效,execdir
和-print0
需要使用(
,进行分组)
。
- 如果测试成功,则不会发生任何事情。如果失败,则目录路径末尾会打印一个 ASCII NUL (
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
反转输出,以便仅显示不匹配的内容。