폴더 내 파일 이름의 상향식 역스왑

폴더 내 파일 이름의 상향식 역스왑

폴더에 jpg 파일이 몇 개 있습니다.

hg_test_spr.jpg
hg_test00001.jpg
hg_test00002.jpg
hg_test00003.jpg
hg_test00004.jpg
hg_test00005.jpg
hg_test00006.jpg
.
.
.
hg_test01200.jpg

첫 번째 파일의 이름이 마지막 파일로 바뀌고 두 번째 파일이 두 번째에서 마지막 파일로 바뀌도록 파일 이름을 역순으로 바꾸고 싶습니다.

다시 말해서:

hg_test_spr.jpg --> DO NOT RENAME THIS
hg_test00001.jpg --> hg_test01200.jpg
hg_test00002.jpg --> hg_test01199.jpg
hg_test00003.jpg --> hg_test01198.jpg
hg_test00004.jpg --> hg_test01197.jpg
hg_test00005.jpg --> hg_test01196.jpg
hg_test00006.jpg --> hg_test01195.jpg
.
.
.
hg_test01199.jpg --> hg_test00002.jpg
hg_test01200.jpg --> hg_test00001.jpg

이 방법으로 파일 목록을 역순으로 가져올 수 있습니다.

ls *.bmp | tac | tee reverse_order.txt

아니면 더 좋을 수도 있습니다:

ls *hg_test0*.bmp | tac | tee reverse_order.txt

그러면 다음과 같을 수도 있습니다.

mkdir renamed
for file in *hg_test0*.bmp; do read line;  cp -v "${file}" "renamed/${line}";  done < reverse_order.txt

이를 수행하는 가장 좋은 방법은 무엇입니까?

답변1

5자리로 표시하는 파일의 번호 순서에 따라 쉘의 glob 기능을 사용하여 필요에 따라 이름을 바꿀 수 있습니다.

shopt -s nullglob
fileList=(hg_test[0-9]*)
count="${#fileList[@]}"

for file in hg_test[0-9]*; do 
     echo "$file" "hg_test$(printf "%05d" "$count").jpg"
     ((count--))
done

echo이는 기본적으로 대체된 파일 이름을 포함한 실제 파일 이름 입니다 . 이름이 예상대로 그대로 유지되면 삭제 echo하고 mv명령을 사용하십시오.

답변2

hg_*[0-9].jpg올바른 "앞으로" 순서로 이름을 바꾸려는 모든 파일을 확장하고 이름이 바뀐 파일을 하위 디렉토리에 기록하려고 한다고 가정합니다 renamed.

사용 bash:

mkdir renamed || exit 1    # fail if this directory exists
names=( hg_*[0-9].jpg )

for (( i=0; i < "${#names[@]}"; ++i )); do
    cp "${names[i]}" renamed/"${names[-(i+1)]}"
done

먼저 배열에 저장된 파일 이름 목록을 생성합니다 names. 루프는 생성된 이름 목록을 반복하고 목록 끝에서 특정 오프셋에 있는 각 파일의 새 이름을 선택합니다. 기존 파일은 수정되지 않으며 새 이름의 복사본이 renamed폴더에 기록됩니다.

관련 정보