Regex를 사용하여 일괄 이름 바꾸기를 수행하지만 일부 하위 문자열 유지

Regex를 사용하여 일괄 이름 바꾸기를 수행하지만 일부 하위 문자열 유지

나는 이 질문을 하기 전에 많은 연구를 했다. 이와 유사한 정규식을 사용하여 일괄 이름 바꾸기를 수행하는 다른 링크를 찾았습니다.

*패턴 기반, 터미널에서 배치 파일 이름 바꾸기

내 문제는 Regex를 사용하여 일괄 이름 바꾸기를 수행하고 싶지만 코드가 작동하지 않는다는 것입니다.

폴더 안에 다음과 같은 이름의 다른 파일이 있습니다.

name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg

그리고 파일 이름을 다음과 같이 바꾸고 싶습니다.

name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg

내가 원하는 대부분의 코드는 다음과 같습니다.

$  rename -v 's/house\_[0-9]\_door/house_[0-9]/'

하지만 아시다시피 첫 번째 파일의 이름은 name_house_[0-9].jpg로 변경되었습니다.

답변1

훨씬 쉬운 방법은 _door이름 바꾸기를 사용하여 삭제하는 것입니다.

rename -v 's/_door//' *

이는 아무것도 검색하지 _door않고 대체하여 본질적으로 삭제합니다.

답변2

  1. 표현식의 검색 측면에서 밑줄을 이스케이프 처리하고 있으므로 그렇게 해서는 안 됩니다.
  2. 하위 검색 결과를 저장하고 사용하려면 하위 검색(숫자)과 자리 표시자가 필요합니다.

[0-9] 주위에 괄호를 추가하면 필요한 하위 검색이 생성됩니다. 첫 번째 하위 검색이므로 교체 측면에서 $1이라고 할 수 있습니다. 결과는 다음과 같습니다..

rename -v 's/house_([0-9])\_door/house_$1/' *

도움이 되었기를 바랍니다.

답변3

당신은 사용해야합니다역참조. 문자 클래스는 대체 표현식에서 아무 의미도 없습니다. 실제로 대체 표현에서 특별한 의미를 갖는 문자는 거의 없습니다. 나는 다음과 같은 것을 가정합니다 :

rename -v 's/house_([0-9])_door/house_$1/'

(또는)

rename -v 's/(house_[0-9])_door/$1/'

또한 -n플래그를 사용하여 실제로 이름 변경을 수행하기 전에 어떤 이름 변경이 발생하는지 확인하세요.

답변4

이것은 Fish Shell에서 작동합니다.

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end

관련 정보