굵은 숫자를 기준으로 파일 이름이 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_6862568
echo
답변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
-n
options 명령을 사용해 보십시오 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
'