파일 세트의 이름을 바꾸는 스크립트를 만들려고 합니다. 일반적으로 TIF이지만 때로는 이상한 일이 발생할 수 있으므로 파일 이름을 바꾸고 파일 확장자를 무시하고 싶습니다.
파일 이름은 모두 동일하며 에포크 시간이 차별화 요소로 추가되었습니다. 최종 결과는 다음과 유사합니다.
Name1=CLMSFILE
Name2=Epoch
Name3=_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
CLMSFILE53253_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES.TIF (or other extension)
이것이 내가 현재 가지고 있는 것입니다.
#Rename files and insert epoch time
name1=$CLMSFILE
name2=$(date +%s%3N)
name3=$_A\ BUNCH\ OF\ OTHERTEXT_WITH_A_MIXTURE\ OF\ UNDERSCORES\ AND_SPACES
for f in *; do
newname=$name1$name2$name3
mv -n "$f" "${newname}"
done
이 명령을 실행한 후 첫 번째 파일의 이름만 바꾸었지만 첫 번째 변수는 무시되고 확장자가 없습니다.
1653049404956 _A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES
220220217SOMEORG20003_01.TIF
220220217SOMEORG30004_01.TIF
답변1
셸 스크립트에는 관찰된 오류를 일으키는 몇 가지 문제가 있습니다.
당신 이름의 일부는 be 입니다
CLSMFILE
. 그러나 선언한 변수 할당에서는name1=$CLMSFILE
첫 번째 부분에 내용을 할당합니다.이름이 지정된 쉘 변수CLSMFILE
, 존재하지 않으므로 비어 있을 수 있습니다. 해당 부분에 대해서도 실제로 동일name3
하지만 문자열을 로 시작하면_
셸$_
에서 특별한 의미가 있으므로 해석이 즉시 중지되고_
문자열의 나머지 부분은 변경되지 않은 채 변수로 가져옵니다.스크립트는 모든 파일의 이름을 같은 이름으로 바꾸려고 시도합니다. 운 좋게도 해당 옵션을 사용했습니다
-n
. 그렇지 않으면 디렉터리의 마지막 파일을 제외한 모든 파일이 손실되었을 것입니다.그 이유는
date
명령이name2=$(date ...)
평가되기 때문입니다.$name2
변수를 사용할 때마다가 아니라 할당할 때. 따라서 루프의 모든 반복에 대해 일정합니다.파일 확장자를 갖고 싶다고 말했지만 파일에 확장자를 추가하는 것을 잊었습니다.
mv
이름 바꾸기전체 파일 이름, 이전 부분뿐만 아니라.
파일 이름에 둘 이상이 허용되기 때문입니다..
나는 당신이 사용하는 것이 좋습니다shellcheck
, 쉘 스크립트에서 오류를 잡기 위한 독립형 도구로도 사용할 수 있습니다.
다음 수정 사항이 적용됩니다.
name1="CLMSFILE"
name3="_A BUNCH OF OTHERTEXT_WITH_A_MIXTURE OF UNDERSCORES AND_SPACES"
for f in *; do
basename=${f%.*}
newbasename="$name1$(date +%s%3N)$name3"
newname=${f/$basename/$newbasename}
mv -n "$f" "${newname}"
done
이것은 쉘 문자열 조작을 사용하여
- "basename" 부분
$f
(즉, 마지막으로 구분된 부분 이전의 모든 항목.
)을 변수에 저장합니다.$basename
- 규칙에 따라 새 기본 이름을 생성하되
date
루프 반복마다 명령을 실행하세요. $basename
부분 문자열을$f
다음으로 대체$newbasename
- 그에 따라 파일 이름을 바꾸십시오.
mv -n ...
이상적으로는 부품을 비슷한 것으로 교체 할 수 있습니다.
echo "Renaming '$f' to '$newname'"
이름 생성 논리가 제대로 작동하는지 확인할 때까지.