모든 하위 디렉터리의 모든 파일 이름 바꾸기

모든 하위 디렉터리의 모든 파일 이름 바꾸기

하위 디렉터리 이름과 자동 번호 매기기를 사용하여 모든 하위 디렉터리의 모든 파일 이름을 바꾸는 방법.

전임자:

parent
-subdir
--file.jpg
--cat.jpg
--dog.jpg

이름 바꾸기:

parent
-subdir
--subdir_01.jpg
--subdir_02.jpg
--subdir_03.jpg

이 스크립트를 사용하고 있지만 재귀적이지 않습니다.

#!/bin/bash
a=1
b="$1"
for i in *.jpg; do
  new=$(printf "%04d" ${a}) #04 pad to length of 4
  mv "${i}" ""$1"_${new}.jpg"
  let a=a+1
done

답변1

이 문장이 가능합니다:

find path/ -name '*.jpg' -exec bash -c 'dn=$(dirname "$1"); bn=$(basename "$dn"); c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;

가독성을 위해 줄이 분할되었습니다.

find path/ -name '*.jpg' -exec bash -c '\
  dn=$(dirname "$1"); bn=$(basename "$dn"); \
  c=$(ls "$dn/$bn"_??.jpg 2>/dev/null | wc -l); c=$((c+1)); \
  cnt=$(printf "%02d" $c); mv "$1" "$dn/${bn}"_$cnt.jpg' -- {} \;

답변2

재귀적 접근 방식보다는 반복적 접근 방식을 사용하는 것이 좋습니다. (하위)디렉터리를 검색하려면 "-type d" 인수와 함께 "찾기" 도구를 사용하세요.

예:

find parentdir -type d | while read d ; do
    a=1
    # For example, $d could be "parent/subdir"
    b="$(basename $d)"
    # For above example, $b would be "subdir"
    for i in "${d}/*.jpg" ; do
        new=$(printf "%04d" ${a})
        mv "${i}" "${d}/${b}_${new}.jpg"
        let a=a+1
    done
done

아직 코드를 테스트하지는 않았지만 코드가 어떻게 보일지에 대한 좋은 아이디어를 제공할 것입니다. 잠재적인 문제는 파일 이름의 공백일 수 있습니다. IFS를 재정의하면 도움이 될 수 있습니다.

관련 정보