하위 디렉터리에 있는 여러 파일의 이름을 해당 디렉터리 이름으로 바꿉니다.

하위 디렉터리에 있는 여러 파일의 이름을 해당 디렉터리 이름으로 바꿉니다.

내 데스크탑에 Models라는 폴더가 있습니다. 해당 폴더 내에는 .jpg 확장자가 없는 JPEG 파일이 포함된 명명된 폴더가 있습니다. JPEG 파일 이름은 임의의 해시입니다. bash 스크립트를 사용하여 이러한 jpeg 파일의 이름을 디렉터리 이름으로 점진적으로 일괄 변경하고 각 파일에 .jpg 확장자를 추가하고 싶습니다.

기본적으로는 이렇습니다

롤모델/

 Alice/
      a5ccB2ff3e
      ee420bc4a
      2acee54dc
      ...
 Alex/
      de33fa24c0
      d1eaa48e0a
      ...

나는 그런 사람이 되고 싶다

롤모델/

 Alice/
      Alice001.jpg
      Alice002.jpg
      Alice003.jpg
      ...

 Alex/
      Alex001.jpg
      Alex002.jpg
      ...

답변1

귀하의 질문에 대한 설명을 바탕으로 나는 가정합니다.폴더의 총 파일 수는 999개를 초과할 수 없습니다.

다음은 간단한 bash 스크립트입니다. 최상위 디렉터리(예: 모델)에서 실행하세요.

#!/bin/bash
for i in ./*
do
if [ -d "$i" ]
then
j=001
for k in "$i"/*
do
mv "$k" "$i"/"$i""$j".jpg
j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi
(( j++ ))
j=`printf '%03i' $j`
done
fi
done

먼저 디렉토리인지 아닌지에 관계없이 Models의 모든 파일을 확인합니다 if [ -d "$i" ]. 그런 다음 해당 디렉토리의 모든 파일에 대해 이름이 mv "$k" "$i"/"$i""$j".jpg.

j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi

위의 코드는 처음부터 모든 0을 제거하므로 다음과 같은 오류가 발생하지 않습니다.

 ((: 008: value too great for base (error token is "008")
 printf: 008: invalid octal number

그리고

j=`printf '%03i' $j`

j값을 3비트 길이 로 만듭니다 .

답변2

Debian_yadav 제안의 단순화된 버전을 시도해 볼 수도 있습니다:

for i in *
  do    if [ -d "$i" ] && cd "$i"
          then  j=0
                for k in *
                  do    ((j++))
                        echo mv "$k" $(printf "%s%03d.jpg" $i $j )
                  done
                cd ..
          fi
  done

디버깅에만 해당됩니다 echo. 표시되는 내용이 마음에 들면 삭제하세요.

사용 가능한 모든 디렉터리로 이동 cd하여 카운터를 재설정하고 모든 대상 파일을 반복하고 각 디렉터리의 카운터를 증가시킨 다음 이름을 바꿉니다.

관련 정보