这是后续另一个问题我已经发布
我使用脚本根据特定顺序自动重命名文件:
#!/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)
那么:
名称 ($pages) printf '%s %s\n' ${pages[(i)$name]} $name
1 foo
2 bar
3 baz
4 bom
5 top