找到... | 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 ... |总文件大小?的主要内容,如果未能解决你的问题,请参考以下文章