使用 find 执行多个重命名命令

使用 find 执行多个重命名命令

想要将find命令与一些重命名命令一起使用。我该怎么做。

find这是我想用命令执行的序列

rename "s/ /-/g" * ; rename 'y/A-Z/a-z/' * ; rename 's/[.]-/-/g' * ; rename 's/--/-/g' *

答案1

你不需要rename在这里单独的。第一个argument重命名的代码可以是perl对文件路径(如存储在 中)进行所需修改的任何代码$_,您不必使用s/pattern/replacement/flags其中的一个。

在这里,你可以这样做:

find . -depth -exec rename -n -d '
  $_ = lc $_; # lowercase
  s/[ .-]*[ -]+/-/g' {} +

或者如果你rename不支持-d

find . -depth -mindepth 1 -exec rename -n '
  my ($dirname, $basename) = m{(.*)/(.*)}s;
  $basename = lc $basename; # lowercase
  $basename =~ s/[ .-]*[ -]+/-/g;
  $_ = "$dirname/$basename"' {} +

这里把所有的都<0-or-more-spaces-or-dot-or-dash><1-or-more-spaces-or-dash>变成一个破折号,但是你可以做所有的s/.../.../s,用 s 分隔;

find . -depth -exec rename -n -d '
  s/ /-/g;
  y/A-Z/a-z/;
  s/[.]-/-/g;
  s/--/-/g' {} +

无论如何,您要确保替换仅应用于基本名称(因此是-d),并且叶子在它们所在的分支之前被重命名(因此是-depth)。

-n以上用于试运行)。

相关内容