JPEG가 포함된 각 디렉터리의 각 디렉터리에 대한 JPEG 이미지의 총 크기를 가져옵니다.

JPEG가 포함된 각 디렉터리의 각 디렉터리에 대한 JPEG 이미지의 총 크기를 가져옵니다.

나는 그러한 이미지를 포함하는 각 디렉토리에 있는 .jpg모든/images의 각 디렉토리의 전체 크기를 얻으려고 노력하고 있습니다. .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이것을 할 수 있습니다. GNU 찾기(예: Linux 또는 Cygwin에서)를 사용하여 디렉터리에 너무 많은 .jpg파일이 포함되어 있지 않다고 가정하면 -execdir기본 찾기를 사용하면 find디렉터리에서 일치하는 모든 파일에 대해 명령을 실행할 수 있습니다.

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

관련 정보