想要将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
以上用于试运行)。