후속작입니다또 다른 문제나는 출판했다
특정 순서에 따라 파일 이름을 자동으로 바꾸는 스크립트를 사용합니다.
#!/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와 함께 제공되는 -iregex
BSD 버전의 주요 버전 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