我使用脚本根据特定顺序自动重命名文件:
#!/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]}
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
.
有没有办法使用该rename
实用程序来简化此过程?我使用的是 Mac OS X 10.10。
(对于纯 zsh 解决方案,请参阅我可以使用 Zsh 内置的通配符匹配来代替这里的 `find` 的使用吗?)
答案1
如果你能得到你的清单文件作为 Perl 的一组参数,rename
这可以很容易地完成:
rename 'no warnings; $a++; s!^(.*/)?(.*)!$1$a-$2!' "$@"
变量$a
和$b
是 Perl 中预先声明的全局变量,因此尽管整个表达式应被视为在循环内(并相应地限定范围),但它们将在执行的整个生命周期中保留其值。替换本身将插入当前值$a
作为文件名的一部分,从而允许参数也可以是路径名。 (我们将参数拆分为dirname
和basename
,得到分量 $1 和 $2。)
编译no warnings
指示停止替换,抱怨缺少路径名组件。通常不需要这样做,但我认为该rename
命令启用了额外的警告。
添加-n
到试运行,或-v
用于确认后的操作。
或者,您可以使用 perl 片段来获取您获得的参数并将它们应用到一组文件。但当您完成此操作后,您也可以在 Perl 中解析 YAML。