我正在寻找文件名中的某个正则表达式,并寻求以独特的方式返回父文件夹及其大小。
例如,这是我期望起作用的命令:
find -E . -type f -regex '.*[fF][oO][oO].*' -maxdepth 2 | rev | cut -d'/' -f2- | rev | egrep -v '\.$' | uniq | xargs du -sh
xargs: unterminated quote
由于文件名中存在不同的引号,此操作失败了:
所以我最终使用了find
with-print0
和xargs
with -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
rev
和egrep
都uniq
吃掉你的零并看到一条线。如果你有 GNUfind
和uniq
你可以简化很多:
find ...tests... -printf '%h\0' | uniq -z | xargs -0 du -sh
GNUfind
的-printf
选项采用描述每个文件的输出的格式。%h
是直到但不包括文件名的路径格式,然后\0
使其以零结尾。uniq -z
告诉它使用零来终止每个记录 - 否则它只会看到一行,并且本质上就像cat
.xargs
然后可以像以前一样继续。
可以想象的是sort -z -u
uniq
比考虑无序的名称更好,尽管您的最大深度要求意味着只有.
中间的任何内容才会出现多次。-mindepth 2
也会避免这种情况。
如果您的文件名中都没有零
答案2
示例命令中的主要复杂之处是获取目录名称。您可以使用-printf
选项更轻松、直接地实现此目的find
。它有一种仅用于写出目录的格式:%h
.使用它应该可以大大简化你的命令。
要仅写出目录,请使用:
find ... -type f ... -printf '%h\n'
您也可以将其用于\0
- 终止的行:
find ... -type f ... -printf '%h\0'
问题中的第二个命令有一个额外的问题:它使用在行上工作的命令管道,但输入不是行 - 没有换行符,就像您用于\0
行终止一样。换句话说:整个输出都在一行上。