我可以使用 Zsh 内置的通配符匹配来代替这里的 `find` 的使用吗?

我可以使用 Zsh 内置的通配符匹配来代替这里的 `find` 的使用吗?

这是后续另一个问题我已经发布

我使用脚本根据特定顺序自动重命名文件:

#!/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)那么:

名称 ($pages)
printf '%s %s\n' ${pages[(i)$name]} $name
1 foo
2 bar
3 baz
4 bom
5 top

相关内容