我试图获取包含此类图像的每个目录中所有.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
: find
can 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