나는 최근에 다음을 사용하여 파일 이름을 바꾸는 이 기술을 발견했습니다 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
대문자로 변환하려는 경우)