한 확장명에서 다른 확장명으로 파일 이름을 일괄적으로 바꾸려고 합니다(배경: 내 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를 확장합니다 .