我正在用正则表达式重命名文件...
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"
您可能想要添加错误检查,例如确保目标尚不存在、源确实存在等。