找到... | grep -ve ... |总文件大小?

Posted

技术标签:

【中文标题】找到... | grep -ve ... |总文件大小?【英文标题】:find ... | grep -ve ... | total filesize? 【发布时间】:2014-08-03 23:47:30 【问题描述】:

我想获得一大组文件的总大小,减去很多我不想要的文件。我可以得到我想要的文件的路径

find /path/to/filespace/ -type f | grep -ve '~$\|csv$\|eps$\|jpg$\|nc$\|ncf$\|pdf$\|png$\|tif$'

但是我真正想要的是这些路径表示的文件的总大小。如果我只想要一个特定扩展名的文件,我可以something like this

find . -name "*txt" -print0 | du -hc --files0-from=- | tail -n 1

但这对于我的实际用例有 2 个问题:

    我想排除某些扩展,而不是包含它们 以上(以及this)依赖于find -print0,我不知道如何使用grep -ve

【问题讨论】:

【参考方案1】:

不要认为grep 是必需的

find -type f \! -regex '.*\.\(csv\|eps\|jpg\|nc\|ncf\|pdf\|png\|tif\)$' -print0 | du -hc --files0-from=- | tail -n 1

或者没有任何regex(用扩展替换...

find -type f \! \( -name  '*.csv' -o -name '*.eps' -o ... \) -print0 | du -hc --files0-from=- | tail -n 1

【讨论】:

我向find 的上级指挥部鞠躬!第一个有效,第二个会打字太多......【参考方案2】:

第一个问题的答案:

您可以使用! 排除某些扩展名。 (由于某些 shell 将 ! 视为特殊字符,因此您可能必须用 '' 包围它)

find . '!' -name "*.txt"

第二个问题的答案:

Gnu grep 有-z 选项,所以你可以使用它

find . -print0 | grep -vze "txt$" | du -hc --files0-from=- | tail -n 1

【讨论】:

请参阅以下有关“grep -z”的“答案”【参考方案3】:

再一次,提问的过程会刺激大脑去寻找答案。我想,-print0 做什么,无论如何? IIRC 它将换行符转换为 0 字节。我知道该怎么做,tr:

find /path/to/filespace/ -type f | grep -ve '~$\|csv$\|eps$\|jpg$\|nc$\|ncf$\|pdf$\|png$\|tif$' | tr '\n' '\0' | du -hc --files0-from=- | tail -n 1

哪个有效!

【讨论】:

【参考方案4】:

您也可以在 Bash 中使用 globbing 执行此操作。

declare -a list
for f in *; do
    case "$f" in
        *.csv|*.eps|*.jpg|*.nc|*.ncf|*.pdf|*.png|*.tif) ;;
        *) list+=("$f");;
    esac
done
du -ch "$list[@]" | tail -n 1

【讨论】:

以上是关于找到... | grep -ve ... |总文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

当我找到多个 pdf 文件、xarg pdftotext 和 grep 模式时,文件名丢失

grep和正则表达式

ps-efgrep未找到命令

【笔记】grep 命令 - 查找文件内容

06-Linux文本处理-grep

如何找到文件的总大小(以字节为单位)? [复制]