Bash
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
: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
)。
假設這是 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 的核心中,除非您的供應商對核心安裝做了奇怪的事情。