이름이 폴더_1.txt, 폴더_2.txt, 폴더_n.txt인 폴더의 파일 이름을 바꾸고 싶습니다.

이름이 폴더_1.txt, 폴더_2.txt, 폴더_n.txt인 폴더의 파일 이름을 바꾸고 싶습니다.

abc내 Ubuntu 컴퓨터에는 , xyz및 이라는 3개의 디렉터리가 있습니다 pst. 각 디렉터리에는 서로 다른 이름을 가진 약 7개의 파일이 있습니다. 각 파일의 이름을 ,,,,,,,, abc_1.txt와 같이 바꾸고 싶습니다 abc_2.txt. 및 디렉토리와 유사합니다. abc_3.txtabc_4.txtabc_5.txtabc_6.txtabc_7.txtxyzpst

이를 명확히하기 위해 다음 답변 중 하나를 시도했습니다.

i=0
for f in */* ; do i=$(( i+1 )) fp=$(dirname "$f"); ext="${f##*.}" ; echo "$f" "$fp"/"$fp"_"$i"."$ext" ;done

출력은 다음과 같습니다

123/1.jpg 123/123_1.jpg
123/2.jpg 123/123_2.jpg
123/3.jpg 123/123_3.jpg
2275/2275_1.jpg 2275/2275_4.jpg
2275/2275_2.jpg 2275/2275_5.jpg
2275/2275_3.jpg 2275/2275_6.jpg
2275/2275_4.jpg 2275/2275_7.jpg
2275/2275_5.jpg 2275/2275_8.jpg
2275/2275_6.jpg 2275/2275_9.jpg
2275/2275_7.jpg 2275/2275_10.jpg
2275/2275_Thumbs.db 2275/2275_11.db
456/1.jpg 456/456_12.jpg
456/2.jpg 456/456_13.jpg
456/3.jpg 456/456_14.jpg

그러나 나는 결과가 다음과 같기를 원합니다.

123/1.jpg 123/123_1.jpg
123/2.jpg 123/123_2.jpg
123/3.jpg 123/123_3.jpg
2275/2275_1.jpg 2275/2275_1.jpg
2275/2275_2.jpg 2275/2275_2.jpg
2275/2275_3.jpg 2275/2275_3.jpg
2275/2275_4.jpg 2275/2275_4.jpg
2275/2275_5.jpg 2275/2275_5.jpg
2275/2275_6.jpg 2275/2275_6.jpg
2275/2275_7.jpg 2275/2275_7.jpg
2275/2275_Thumbs.db 2275/2275_8.db
456/1.jpg 456/456_1.jpg
456/2.jpg 456/456_2.jpg
456/3.jpg 456/456_3.jpg

어떻게 해야 하나요?

답변1

더 나은 이해를 위해 다음을 확인하십시오. - 스크립트에서 이 작업을 수행하고 싶으므로 다음과 같은 명령을 받습니다.

i=0
for f in */* ; do i=$(( i+1 )) fp=$(dirname "$f"); ext="${f##*.}" ; echo "$f" "$fp"/"$fp"_"$i"."$ext" ;done

출력은 다음과 같습니다 -

123/1.jpg 123/123_1.jpg
123/2.jpg 123/123_2.jpg
123/3.jpg 123/123_3.jpg
2275/2275_1.jpg 2275/2275_4.jpg
2275/2275_2.jpg 2275/2275_5.jpg
2275/2275_3.jpg 2275/2275_6.jpg
2275/2275_4.jpg 2275/2275_7.jpg
2275/2275_5.jpg 2275/2275_8.jpg
2275/2275_6.jpg 2275/2275_9.jpg
2275/2275_7.jpg 2275/2275_10.jpg
2275/2275_Thumbs.db 2275/2275_11.db
456/1.jpg 456/456_12.jpg
456/2.jpg 456/456_13.jpg
456/3.jpg 456/456_14.jpg

하지만 나는 이 출력이 다음과 같기를 원합니다.

123/1.jpg 123/123_1.jpg
123/2.jpg 123/123_2.jpg
123/3.jpg 123/123_3.jpg
2275/2275_1.jpg 2275/2275_1.jpg
2275/2275_2.jpg 2275/2275_2.jpg
2275/2275_3.jpg 2275/2275_3.jpg
2275/2275_4.jpg 2275/2275_4.jpg
2275/2275_5.jpg 2275/2275_5.jpg
2275/2275_6.jpg 2275/2275_6.jpg
2275/2275_7.jpg 2275/2275_7.jpg
2275/2275_Thumbs.db 2275/2275_8.db
456/1.jpg 456/456_1.jpg
456/2.jpg 456/456_2.jpg
456/3.jpg 456/456_3.jpg

답변2

cd /path/to/abc; cnt=0; for i in *.*; do mv "$i" "${PWD##*/}_$((++cnt)).${i##*.}"; done
  • cd각 디렉토리 abc, xyz, ...에 대해 해당 디렉토리로 이동 해야 합니다.
  • *.*접미사가 있는 파일만 선택하는 데 사용됩니다.
  • 장난을 치기 전에 mv결과가 어떻게 보일지 확인하기 위해 대체하십시오.echo

편집하다:

여러 디렉터리에 대해 이 작업을 수행하려면 각 디렉터리의 카운터를 재설정하세요.

소식통:

for i in */*.*; do [ "$dn" != "${i%/*}" ] && cnt=0; dn="${i%/*}"; mv "$i" "${dn}/${dn}_$((++cnt)).${i##*.}"; done

아름답게 인쇄되었습니다:

for i in */*.*; do
    # reset counter if different directory or dn is unset
    [ "$dn" != "${i%/*}" ] && cnt=0

    # set directory name
    dn="${i%/*}"

    # move file
    mv "$i" "${dn}/${dn}_$((++cnt)).${i##*.}"
done

관련 정보