파일 이름을 순차적으로 바꾸는 방법

파일 이름을 순차적으로 바꾸는 방법

굵은 숫자를 기준으로 파일 이름이 5개 그룹에서 1-5로 변경되도록 테스트 디렉터리의 파일을 정렬하고 이름을 바꿔야 합니다. 정렬할 수 있었지만 이제 이름을 1,2,3,4 또는 5로 바꿔야 합니다. 이것이 내가 지금까지 가지고 있는 것입니다:

 find . -maxdepth 1 -type f -name '*.txt' | sort -nt_ -k2,2 -k7,7
./FoilHole_6862563_Data_6834945_6834947_20190608_255634_Image.txt
./FoilHole_6862563_Data_6834952_6834954_20190608_255710_Image.txt
./FoilHole_6862563_Data_6834959_6834961_20190608_255748_Image.txt
./FoilHole_6862563_Data_6834935_6834937_20190608_255827_Image.txt
./FoilHole_6862563_Data_6834967_6834969_20190608_255906_Image.txt
./FoilHole_6862568_Data_6834945_6834947_20190608_060123_Image.txt
./FoilHole_6862568_Data_6834952_6834954_20190608_060159_Image.txt
./FoilHole_6862568_Data_6834959_6834961_20190608_360237_Image.txt
./FoilHole_6862568_Data_6834935_6834937_20190608_460316_Image.txt
./FoilHole_6862568_Data_6834967_6834969_20190608_560354_Image.txt

지금 해야 할 일은 이름을 다음과 같이 바꾸는 것입니다.

./FoilHole_6862563_Data_6834945_6834947_20190608_1_Image.txt
./FoilHole_6862563_Data_6834952_6834954_20190608_2_Image.txt
./FoilHole_6862563_Data_6834959_6834961_20190608_3_Image.txt
./FoilHole_6862563_Data_6834935_6834937_20190608_4_Image.txt
./FoilHole_6862563_Data_6834967_6834969_20190608_5_Image.txt
./FoilHole_6862568_Data_6834945_6834947_20190608_1_Image.txt
./FoilHole_6862568_Data_6834952_6834954_20190608_2_Image.txt
./FoilHole_6862568_Data_6834959_6834961_20190608_3_Image.txt
./FoilHole_6862568_Data_6834935_6834937_20190608_4_Image.txt
./FoilHole_6862568_Data_6834967_6834969_20190608_5_Image.txt

답변1

해커 bash스크립트로서:

#!/bin/bash
while IFS= read -r file; do
  newprefix=${file%%_Data*}
  if [ "$prefix" != "$newprefix" ]; then
    cnt=1
    prefix=$newprefix
  fi
  newfile=$(echo "$file" | sed "s/[0-9]*\(_Image.txt\)/$cnt\1/")
  echo mv "$file" "$newfile"
  ((cnt++))
done < <(find . -maxdepth 1 -type f -name '*.txt' | sort -nt_ -k2,2 -k7,7)

산출:

$ ./script.sh
mv ./FoilHole_6862563_Data_6834945_6834947_20190608_255634_Image.txt ./FoilHole_6862563_Data_6834945_6834947_20190608_1_Image.txt
mv ./FoilHole_6862563_Data_6834952_6834954_20190608_255710_Image.txt ./FoilHole_6862563_Data_6834952_6834954_20190608_2_Image.txt
mv ./FoilHole_6862563_Data_6834959_6834961_20190608_255748_Image.txt ./FoilHole_6862563_Data_6834959_6834961_20190608_3_Image.txt
mv ./FoilHole_6862563_Data_6834935_6834937_20190608_255827_Image.txt ./FoilHole_6862563_Data_6834935_6834937_20190608_4_Image.txt
mv ./FoilHole_6862563_Data_6834967_6834969_20190608_255906_Image.txt ./FoilHole_6862563_Data_6834967_6834969_20190608_5_Image.txt
mv ./FoilHole_6862568_Data_6834945_6834947_20190608_060123_Image.txt ./FoilHole_6862568_Data_6834945_6834947_20190608_1_Image.txt
mv ./FoilHole_6862568_Data_6834952_6834954_20190608_060159_Image.txt ./FoilHole_6862568_Data_6834952_6834954_20190608_2_Image.txt
mv ./FoilHole_6862568_Data_6834959_6834961_20190608_360237_Image.txt ./FoilHole_6862568_Data_6834959_6834961_20190608_3_Image.txt
mv ./FoilHole_6862568_Data_6834935_6834937_20190608_460316_Image.txt ./FoilHole_6862568_Data_6834935_6834937_20190608_4_Image.txt
mv ./FoilHole_6862568_Data_6834967_6834969_20190608_560354_Image.txt ./FoilHole_6862568_Data_6834967_6834969_20190608_5_Image.txt

파일 이름 접두사가 변경될 때마다 카운터 변수는 cnt으로 재설정됩니다(예: 로 변경되는 경우). 실제로 파일 이름을 바꾸려면 스크립트에서 해당 파일을 제거해야 합니다.1./FoilHole_6862563./FoilHole_6862568echo

답변2

bash산술을 명령과 결합 할 수 있습니다 rename.

i=0
find . -maxdepth 1 -type f -name '*.txt' |
sort -nt_ -k2,2 -k7,7 |
while read filename ; do
    rename -v "s/[0-9]+_Image/$((i%5+1))_I/" ${filename}
    i=$((i+1))
done

-noptions 명령을 사용해 보십시오 rename. 수행 중인 작업만 표시됩니다.

경고하다:

파일 이름은 파이프된 입력에서 가져오고 변수는 여기에 내장된 함수를 사용하여 설정 filename됩니다 . read이것~ 할 것이다파일 이름이 질문에 지정한 형식(예: 공백, 개행 등이 포함된 파일 이름)과 일치하지 않으면 중단됩니다. 따라서 find옵션 -print0과 같은 다른 방법을 사용해야 합니다 xargs -0.

이 경우 카운터의 도우미 파일을 ?변수 대체 파일로 사용하세요.

echo -1 > file_counter
find -name '*txt' -print0 |
sort -znt_ -k2,2 -k7,7 |
xargs -I ? -0 bash -c '
     i=$(($(cat file_counter)+1))
     rename -n -v "s/[0-9]+_Image/$(($i%5+1))/"  ?
     echo $i > file_counter
'

관련 정보