使用 find 搜索条件时获取父文件夹的大小?

使用 find 搜索条件时获取父文件夹的大小?

我正在寻找文件名中的某个正则表达式,并寻求以独特的方式返回父文件夹及其大小。

例如,这是我期望起作用的命令:

find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs du -sh

xargs: unterminated quote由于文件名中存在不同的引号,此操作失败了:

所以我最终使用了findwith-print0xargswith -0

find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 -print0 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs -0 du -sh

然而我最终遇到了一个错误:这显然du: Binary file (standard input) matches是由于uniq修改了 find 格式的输出-print0

在搜索父文件夹下匹配的任何文件或文件夹时,您建议如何查找父文件夹大小?我重复一遍,我只是想找到顶级文件夹名称及其随附的大小 ( du -sh),并且没有子文件夹路径或文件信息,以便我最终得到一个具有匹配条件的主文件夹的整洁列表。

答案1

revegrepuniq吃掉你的零并看到一条线。如果你有 GNUfinduniq你可以简化很多:

find ...tests... -printf '%h\0' | uniq -z | xargs -0 du -sh

GNUfind-printf选项采用描述每个文件的输出的格式。%h是直到但不包括文件名的路径格式,然后\0使其以零结尾。uniq -z告诉它使用零来终止每个记录 - 否则它只会看到一行,并且本质上就像cat.xargs然后可以像以前一样继续。

可以想象的是sort -z -uuniq比考虑无序的名称更好,尽管您的最大深度要求意味着只有.中间的任何内容才会出现多次。-mindepth 2也会避免这种情况。

如果您的文件名中都没有零

答案2

示例命令中的主要复杂之处是获取目录名称。您可以使用-printf选项更轻松、直接地实现此目的find。它有一种仅用于写出目录的格式:%h.使用它应该可以大大简化你的命令。

要仅写出目录,请使用:

find ... -type f ... -printf '%h\n'

您也可以将其用于\0- 终止的行:

find ... -type f ... -printf '%h\0'


问题中的第二个命令有一个额外的问题:它使用在行上工作的命令管道,但输入不是行 - 没有换行符,就像您用于\0行终止一样。换句话说:整个输出都在一行上。

相关内容