![정규식을 사용하여 이름이 바뀐 파일의 핸들을 얻는 방법은 무엇입니까?](https://linux55.com/image/201277/%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9D%B4%EB%A6%84%EC%9D%B4%20%EB%B0%94%EB%80%90%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%95%B8%EB%93%A4%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
정규식을 사용하여 파일 이름을 바꾸고 있습니다.
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"
대상이 아직 존재하지 않는지, 소스가 존재하는지 등을 확인하는 등의 오류 검사를 추가할 수 있습니다.