폴더에 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
폴더에 기록됩니다.