Bash

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

  • September 19, 2017

當我在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 的核心中,除非您的供應商對核心安裝做了奇怪的事情。

引用自:https://unix.stackexchange.com/questions/393250