정규식을 사용하여 이름이 바뀐 파일의 핸들을 얻는 방법은 무엇입니까?

정규식을 사용하여 이름이 바뀐 파일의 핸들을 얻는 방법은 무엇입니까?

정규식을 사용하여 파일 이름을 바꾸고 있습니다.

f='/path/to/file'
rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' "$f"

그러면 무엇을 이름을 바꿔야 할지 모르는 경우 작업할 수 있도록 이름이 바뀐 파일에 대한 핸들을 어떻게 얻습니까?

답변1

renamePerl 표현식(보다 정확하게는 대체)을 제공하고 있습니다 . 표현식을 할당하는 대신 renamePerl을 사용하여 표현식을 평가한 다음 파일을 이동합니다.

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"

대상이 아직 존재하지 않는지, 소스가 존재하는지 등을 확인하는 등의 오류 검사를 추가할 수 있습니다.

관련 정보