zsh: zmv를 사용하여 파일 이름을 일괄적으로 바꾸는 데 문제가 있음

zsh: zmv를 사용하여 파일 이름을 일괄적으로 바꾸는 데 문제가 있음

한 확장명에서 다른 확장명으로 파일 이름을 일괄적으로 바꾸려고 합니다(배경: 내 Rails 앱에서 erb 대신 haml을 사용함). 이름 바꾸기 명령을 실행하면 다음과 같은 출력이 표시됩니다.

% zmv '**/*.erb' $1.haml    
zmv: error(s) in substitution:
app/views/l/links/index.html.erb and app/views/index/index.html.erb both map to .haml
app/views/l/links/new.html.erb and app/views/l/links/index.html.erb both map to .haml
app/views/l/links/show.html.erb and app/views/l/links/new.html.erb both map to .haml
app/views/l/links/stats.html.erb and app/views/l/links/show.html.erb both map to .haml
app/views/layouts/application.html.erb and app/views/l/links/stats.html.erb both map to .haml
app/views/u/profiles/_form.erb and app/views/layouts/application.html.erb both map to .haml
app/views/u/profiles/edit.html.erb and app/views/u/profiles/_form.erb both map to .haml
app/views/u/profiles/show.html.erb and app/views/u/profiles/edit.html.erb both map to .haml
app/views/u/user_sessions/new.html.erb and app/views/u/profiles/show.html.erb both map to .haml
app/views/u/users/_form.erb and app/views/u/user_sessions/new.html.erb both map to .haml
app/views/u/users/new.html.erb and app/views/u/users/_form.erb both map to .haml
app/views/u/users/show.html.erb and app/views/u/users/new.html.erb both map to .haml

누구든지 이 문제를 해결하기 위해 올바른 방향을 알려줄 수 있습니까?

답변1

나는 당신이 정말로 원하는 것이 다음과 같다고 생각합니다.

% zmv '(**/)(*).erb' '$1/$2.haml'
#      ^$1  ^$2

괄호를 사용하여 일치 그룹을 만들고 파일 경로에 대한 일치 그룹을 만든 다음 파일 이름에 대한 일치 그룹을 만들어야 합니다. 또한, zmv의 두 번째 인수도 작은따옴표로 묶어야 합니다.

또한 실행하기 전에 "-n"을 사용하여 zmv 명령을 테스트하는 것이 매우 좋은 생각입니다. (-n은 이름이 변경될 내용을 알려주지만 실제로 이름이 변경되지는 않습니다.)

답변2

zsh당신은 당신이 무엇을 언급하고 있는지 말해야합니다 $1. 두 가지 가능성이 있습니다:

  • 사용하려는 소스 패턴 부분을 괄호로 묶습니다. 예를 들어 에서 zmv '(*)/(*).erb' '$1/$2.haml''$1'은 첫 번째 와 일치하는 것을 의미하고 *' $1'은 $2두 번째와 일치하는 것을 의미합니다 $2.

    [편집하다(감사해요클리유효함을 나타내는 데 사용됨 (**/))] 대괄호는 여러 디렉터리 수준에서 사용하기에는 약간 어색합니다. as로 쓰면 (**)이중 별표는 특별한 의미를 잃습니다(단일 디렉토리 수준에만 일치함). 그리고 일반적으로 /괄호를 사용할 수 없으므로 (**/*)이는 유효한 패턴이 아닙니다. 다만, 특별한 경우 (**/)는 유효하므로 zmv '(**/)(*).erb' '$1$2.haml'.

  • -w옵션을 사용하면 이 경우 각 옵션은 다음과 같습니다.$N질소소스 패턴의 첫 번째 와일드카드 문자입니다. 예를 들어, zmv -w '**/*.erb' '$1/$2.haml'원하는 대로 하십시오.

대체 텍스트 주위에는 항상 작은따옴표를 사용해야 합니다(또는 사용 \$). 그렇지 않으면 쉘은 내장 명령에 $도달하기 zmv전에 s를 확장합니다 .

관련 정보