当我在命令中使用组匹配模式rename
并在替换部分中使用它们的反向引用时,我也希望在我的rename
命令中进行命令替换扩展并使用双引号进行扩展,但 shell 也将反向引用视为参数,并且导致重命名问题。我怎样才能避免这种情况?
rename "s:(.*)$(date +"%Y%m%d"):$1$(date -d "+1day" +"%Y%m%d"):" *
我还尝试了单独的命令替换扩展部分,但没有运气,它只是在$(date -d "+1day" +"%Y%m%d")
.
rename 's:(.*)'"$(date +"%Y%m%d")"':$1'"'"$(date -d "+1day" +"%Y%m%d")"'"':' *
答案1
只是$
逃避$1
:
rename "s:(.*)$(date +"%Y%m%d"):\$1$(date -d "+1day" +"%Y%m%d"):" *
但你可以像这样简化你的模式:
rename "s#$(date +%Y%m%d)#$(date -d +1day +%Y%m%d)#" *
(这假设#
没有出现在 的展开中date
)。
答案2
假设这是 Perl 版本rename
,一种解决方案是使用 Perl 执行日期数学。
rename 'use Time::Piece;use Time::Seconds;$t=localtime;$n=$t+ONE_DAY;$f=q{(.*)}.$t->strftime("%Y%m%d");s:$f:$1.$n->strftime("%Y%m%d"):e' *
这些模块应该在perl
>= 5.10 的核心中,除非您的供应商对核心安装做了奇怪的事情。