나는 그러한 이미지를 포함하는 각 디렉토리에 있는 .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