정규식을 사용하여 파일 이름을 바꾸고 있습니다.
f='/path/to/file'
rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' "$f"
그러면 무엇을 이름을 바꿔야 할지 모르는 경우 작업할 수 있도록 이름이 바뀐 파일에 대한 핸들을 어떻게 얻습니까?
답변1
rename
Perl 표현식(보다 정확하게는 대체)을 제공하고 있습니다 . 표현식을 할당하는 대신 rename
Perl을 사용하여 표현식을 평가한 다음 파일을 이동합니다.
f='/path/to/file'
newname=$( perl -pe 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' <<<"$f" )
printf 'New name is "%s"\n' "$newname"
mv -- "$f" "$newname"
또는 표현식을 사용하여 새 이름을 출력하고 다음에서 캡처할 수도 있습니다 rename
.
f='/path/to/file'
newname=$( rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s; print "$_\n"' "$f" )
printf 'New name is "%s"\n' "$newname"
rename
이는 Perl 기반 모듈을 사용하고 있다고 가정합니다 File::Rename
.
답변2
작업을 부분적으로 제출해야 합니다. 이름을 바꾸려는 파일을 찾아 변환된 파일 이름을 생성하고 적용해야 합니다. 이 시점에서 대상 파일 이름을 알 수 있으므로 추가로 처리할 수 있습니다.
f='/path/to/file'
g=$(printf '%s\n' "$f" | sed -E 's/^(.*)([ab])(.*)([cd])(.*)$/\1\4\3\2\5/')
mv -- "$f" "$g"
echo "Target is $g"
대상이 아직 존재하지 않는지, 소스가 존재하는지 등을 확인하는 등의 오류 검사를 추가할 수 있습니다.