我可以使用重命名实用程序来简化使用 Find 和 Mv 的脚本吗?

我可以使用重命名实用程序来简化使用 Find 和 Mv 的脚本吗?

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

#!/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作为文件名的一部分,从而允许参数也可以是路径名。 (我们将参数拆分为dirnamebasename,得到分量 $1 和 $2。)

编译no warnings指示停止替换,抱怨缺少路径名组件。通常不需要这样做,但我认为该rename命令启用了额外的警告。

添加-n到试运行,或-v用于确认后的操作。

或者,您可以使用 perl 片段来获取您获得的参数并将它们应用到一组文件。但当您完成此操作后,您也可以在 Perl 中解析 YAML。

相关内容