shell扩展重命名命令反向引用

shell扩展重命名命令反向引用

当我在命令中使用组匹配模式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 的核心中,除非您的供应商对核心安装做了奇怪的事情。

相关内容