zsh에서 "현재 글로브"를 얻는 방법

zsh에서 "현재 글로브"를 얻는 방법

나는 비슷한 것을 하고 싶다:

$ convert [a,b,c,d,e].png -resize 50% <current_match>_half.png

어떻게 해야 하나요? 현재 일치 항목을 저장하는 변수가 있습니까? 문서에서 아무 것도 찾을 수 없지만 잘못된 키워드를 찾고 있는 것일 수도 있습니다.

어쩌면 내가 이것을 할 수 있을 거라 생각했지만 xargs, 나도 그것을 알 수는 없다.

답변1

ImageMagick 도구에는 와일드카드 기능이 제한되어 있습니다. 여러 파일 이름이나 리터럴 와일드카드를 전달하면 순차 번호가 지정된 출력 파일이 생성됩니다. 예:

convert [a-e].png -resize 50% half.png

등을 만듭니다 half-0.png.half-1.png

입력 파일 이름을 일치시키려면 convert루프에서 명시적으로 또는 도구를 통해 한 번에 하나씩 호출해야 합니다. (또는 나중에 파일 이름을 바꿀 수 있지만 그렇게 해도 아무런 이점이 없습니다.) 루프 내에서 zsh를 사용할 수 있습니다.파일 이름 조작또는문자열 연산구조.

for i in [a-e].png; do
  convert $i -resize 50% %{i:t}_half.png
done

이것을 스크립트에서 사용하는 경우 추가해야 할 수도 있습니다.N 글로벌 예선이렇게 하면 일치하는 파일이 없으면 와일드카드 패턴이 비어 있는 것으로 확장됩니다.for i in [a-e].png(N); do …

Zsh에는 패턴에 따라 파일 이름을 바꾸는 도구가 함께 제공됩니다.zmv. 다른 이름 기반 변환에 이를 사용할 수 있습니다.

autoload -U zmv
zmv -p convert -o '-resize 50%' '([a-e]).png' '${1}_half.png'

이러한 이름 패턴을 작성하는 다른 방법은 다음과 같습니다.

zmv -p convert -o '-resize 50%' '([a-e])(.png)' '${1}_half$2'
zmv -p convert -o '-resize 50%' -w '[a-e].png' '${1}_half.png'
zmv -p convert -o '-resize 50%' '[a-e].png' '${f:t}_half.png'

별칭을 만들고 다음을 넣을 수 있습니다 .zshrc.

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
alias zconvert='zmv -p convert'

convert아래 래퍼는 모든 옵션을 내부 따옴표로 전달해야 하는 요구 사항을 제거하므로 위의 별칭보다 약간 더 좋습니다 . 옵션 을 전달하는 경우 zmv모든 옵션 앞에 와야 합니다 convert.

zconvert () {
  typeset -a zmv_options=
  while [[ $1 = -[finqQsvwW] ]]; do
    zmv_options+=($1)
  done
  zmv -p convert $zmv_options -o "$@[1,-3]" $@[-2] $@[-1]
}

답변2

glob에 의해 생성된 이름에 대한 루프로 이것을 작성할 수 있습니다.

for f in [abcde].png; do
    convert "$f" -resize 50% "${f%.png}"_half.png
done

참고: 위의 예에는 구체적인 내용이 없습니다.;모든 POSIX 호환 쉘에서 작동해야 합니다(스프린트,케시,세게 때리다,, 등. ;거의 모든 최신 버전을 포함합니다.).

Stephen Chazeras도 언급했습니다.glob이 어떤 파일과도 일치할 수 없을 때 다른 기본 동작이 있습니다. 즉, 패턴 자체를 확장의 유일한 "결과"로 사용하는 대신 오류 메시지를 표시합니다. 이 경우 이 동작은 다른 셸에서도 조정할 수 있습니다(예 failglob:nullglob세게 때리다, 특수 ~(N)전역 접두사케시NOMATCHNULL_GLOB옵션).

관련 정보