여기서 `find`를 사용하는 대신 Zsh에 내장된 와일드카드 일치를 사용할 수 있나요?

여기서 `find`를 사용하는 대신 Zsh에 내장된 와일드카드 일치를 사용할 수 있나요?

후속작입니다또 다른 문제나는 출판했다

특정 순서에 따라 파일 이름을 자동으로 바꾸는 스크립트를 사용합니다.

#!/usr/bin/env zsh

pages=($(sed -n '/page_order/,/^$/ p' _config.yml | tail -n +2 | sed 's/ - //'))
npages=${#pages}
for ((i=1; i<=$npages; i++)); do
  page=${pages[$i]}
  old=${(f)$(gfind . -iregex ".*/.*${page}.md")[1]}  # <- the line I hope to replace
  pagenumber=$(printf '%0*d\n' ${#npages} $i)
  new="${pagenumber}-${page}.md"
  mv -i $old $new
done

_config.yml항목은 어디에 있나요?

page_order:
 - foo
 - bar
 - baz

파일 foo.md bar.md baz.md이름은 자동으로 1-foo.md 2-bar.m 3-baz.md.

find완전히 건너뛰고 Zsh 와일드카드만 사용할 수 있는 방법이 있나요 ? 도움이 된다면 Mac OS 10.10에서 Zsh 5.1을 사용하고 있습니다. OS X와 ​​함께 제공되는 -iregexBSD 버전의 주요 버전 find은 표준이 아닙니다.

답변1

나는 이것을 zsh혼자서 할 수 있다고 생각합니다 (즉, 를 사용하여 ):zmv

autoload zmv
for name ($pages)
zmv -Qn "(**/)(*${name}.md)(.N)" "\${1}${pages[(i)${name}]}-\${2}"

실행되지 않음을 나타냅니다 -n(시운전) 그러면 다음과 같은 결과가 출력됩니다.

mv -- 'some dir/deeper/gfoo.md' 'some dir/deeper/1-gfoo.md'
mv -- 'some dir/zfoo.md' 'some dir/1-zfoo.md'
mv -- afoo.md 1-afoo.md
mv -- nfoo.md 1-nfoo.md
mv -- bar.md 2-bar.md
mv -- baz.md 3-baz.md
.........

결과가 만족스러우면 삭제 -n하여 파일을 실제로 이동하세요( -i또는 대화형 모드에서 실행하려면 파일을 바꾸세요).


작동 방식:
$name는 배열 요소이고, ${pages[(i)${name}]}는 배열에서 해당 요소의 위치입니다. 예를 들어 pages=(foo bar baz bom top)다음과 같습니다.

이름($페이지)
printf '%s %s\n' ${페이지[(i)$name]} $name
1 foo
2 bar
3 baz
4 bom
5 top

관련 정보