如何获取使用正则表达式重命名的文件的句柄?

如何获取使用正则表达式重命名的文件的句柄?

我正在用正则表达式重命名文件...

f='/path/to/file'
rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' "$f"

然后,如果我不知道要重命名什么,我如何获取重命名文件的句柄,以便可以处理它?

答案1

您正在给出rename一个 Perl 表达式(更准确地说是替换)。不要将该表达式赋予rename,而是使用 Perl 对其求值,然后移动文件:

f='/path/to/file'
newname=$( perl -pe 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s' <<<"$f" )

printf 'New name is "%s"\n' "$newname"
mv -- "$f" "$newname"

或者,只需使用表达式输出新名称并从以下位置捕获它rename

f='/path/to/file'
newname=$( rename 's/(^.*)([ab])(.*)([cd])(.*$)/$1$4$3$2$5/s; print "$_\n"' "$f" )

printf 'New name is "%s"\n' "$newname"

这是假设您正在使用rename基于 Perl 的File::Rename模块。

答案2

您必须将任务分成几部分提交 - 找到要重命名的文件,生成转换后的文件名,然后应用它。此时您知道目标文件名,以便您可以进一步处理它

f='/path/to/file'
g=$(printf '%s\n' "$f" | sed -E 's/^(.*)([ab])(.*)([cd])(.*)$/\1\4\3\2\5/')
mv -- "$f" "$g"
echo "Target is $g"

您可能想要添加错误检查,例如确保目标尚不存在、源确实存在等。

相关内容