获取包含 jpeg 的每个目录中每个目录的 jpeg 图像的总大小

获取包含 jpeg 的每个目录中每个目录的 jpeg 图像的总大小

我试图获取包含此类图像的每个目录中所有.jpg/图像的每个目录的总大小。.jpeg并显示完整的目录路径。

我已经设法从我发现的各种内容中拼凑起来。

for i in $(tree -dfi --noreport); do
  find . \( -iname "*.jpg" -or -iname "*.jpeg" \) -type f -exec du -c {} \; $i
done

但是我收到错误:

find: paths must precede expression

有人知道我做错了什么吗?
或者可以建议任何 bash 的替代方案来满足我的需求?

当我将其更改为以下内容时,我得到同样的错误:

for i in $(tree -dfi --noreport); do
  find $i \( -iname "*.jpg" -or -iname "*.jpeg" \) -type f -exec du {} \; $i
done

答案1

for i in $(tree -dfi --noreport); do
    find $i -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du {} \;
done

将路径名放在命令末尾find-type选项应出现在任何其他选项之前,以使搜索速度更快。这应该可以做到。

顺便说一句,为了对您有所帮助,我会这样做:

for i in $( tree -dfi --noreport ); do 
    find $i -maxdepth 1 -type f \( -iname "*.jpg" -or -iname "*.jpeg" \) -exec du '{}' \; | awk -v d=$i '{ j+=$1; } END{ printf("%s: %d\n", d, j) }' | grep -Ev ": 0$"
done

答案2

$i您的直接错误是调用结束时的额外内容find- 只需将其删除即可。参数的顺序find首先是要遍历的目录,然后是要匹配的表达式。

我不明白调用tree: findcan do this 的意义。使用 GNU find(即在 Linux 或 Cygwin 上),假设您的目录不包含太多.jpg文件,则-execdir主要的 onfind允许您对目录中的所有匹配文件运行命令。

find . \( -name '*.jpg' -o -name '*.jpeg' \) -execdir sh -c 'echo "$(du -c "$@" | sed -n "\$s/\\t.*//p") ${PWD#$0/}"' $PWD {} +

请注意,4.5.9 之前的 GNU find 版本有一个漏洞这会导致-execdir … {} +每个文件运行一个命令,这在这里不好。所以你可能需要更加努力。

您可以在 bash 中遍历目录树。设置该globstar选项以启用模式**/,该模式匹配任意数量的子目录级别,即递归枚举子目录。在每个子目录中,如果有 JPEG 文件,则调用du计算它们的总大小。

shopt -s globstar
for d in **/*/; do
  files=("$d/"*.jpg "$d/"*.jpeg)
  total=$(du -s -- "$files" 2>/dev/null | tail -n 1)
  total=${total%$'\t'*}
  echo "$total"$'\t'"$d"
done

相关内容