bash에서 zmv 호출하기

bash에서 zmv 호출하기

나는 최근에 다음을 사용하여 파일 이름을 바꾸는 이 기술을 발견했습니다 zsh.

autoload zmv
zmv '(*).JPG' '$1.jpg'

다음과 같이 쓸 수도 있습니다.

autoload zmv; zmv '(*).JPG' '$1.jpg'

JPG이것은 광고된 대로 작동하며 대문자 확장자를 소문자로 변경하는 데 사용할 수 있습니다 .

그러나 일반적인 BASH 셸에서 한 줄의 코드로 실행하고 싶습니다. 다음과 같이 호출하려고 하면 다음과 같습니다.

zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"

또는 다음과 같이:

echo 'autoload zmv; zmv -f "(*).JPG" "$1.jpg"' | zsh -i

다음과 유사한 메시지를 받았습니다.

zmv: error(s) in substitution:
….JPG and ….JPG both map to .jpg

이것이 나에게 의미하는 바는 zsh파일 이름이 대소문자를 구분하지 않고 처리된다는 것입니다. 그러나 첫 번째 방법을 실행할 때는 그렇지 않은 것 같습니다.

분명히, 나는 내가 여기서 무엇을 하고 있는지 전혀 모릅니다. 또한 쉘 확장이 방해가 되는 것을 방지하기 위해 작은따옴표와 큰따옴표를 반대로 사용해 보았습니다.

이 명령을 bash에서 한 줄 명령으로 실행하려면 어떻게 해야 합니까?

답변1

존재하다:

zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"

$1큰따옴표 사이에 있으므로 bash쉘( )에 의해 확장되며 빈 문자열이 될 가능성이 높으므로 zsh결국 다음과 같이 해석됩니다.

autoload zmv; zmv -f '(*).JPG' '.jpg'

사용:

zsh -c "autoload zmv && zmv '(*).JPG' '\$1.jpg'"

백슬래시는 어디에 있나요?인용 부호for는 큰따옴표 안의 특별한 의미를 $제거합니다 .bash

다음과 같이 할 수도 있습니다.

zsh -c "autoload zmv && zmv '(*).(#i)jpg' '\$1.jpg'"

여기서 대소문자 를 (#i)구분하지 않는 일치를 켜므로 , , ... 파일의 이름도 .Jpg바꿉니다 ..JPg.jpG

함수로 만들 수도 있습니다.

fix_ext_case() {
  EXT=$1 zsh -c "autoload zmv && zmv \"(*).(#i)\$EXT\" '\$1.\$EXT'"
}

또는 다른 따옴표 조합을 사용하십시오.

fix_ext_case() {
  EXT=$1 zsh -c 'autoload zmv && zmv "(*).(#i)$EXT" "\$1.\$EXT"'
}

다음과 같이 사용됩니다:

fix_ext_case jpg

또는

fix_ext_case png

(또는 fix_ext_case JPG대문자로 변환하려는 경우)

관련 정보