Bash

如何在 printf 中使用重命名命令

  • October 28, 2017

當我試圖修復電視劇的劇集編號時,我玩弄了重命名函式並嘗試將 printf 的返回值作為重命名參數傳遞,但無法做到。我嘗試了幾乎所有的組合

for j in $(seq 1 9);
do 
   rename 's/"$( - "`printf "%d" ${j}`" - )"/"$( - "`printf "0%d" ${j}`" - )"/g' *
done

我能想到但似乎沒有任何效果。我最終只是手動完成,因為在這種情況下我只關心 1-9,所以

rename 's/- 1 -/- 01 -/g' *
rename 's/- 2 -/- 02 -/g' *
...

有人可以指出為什麼上述內容不適用於將來的參考嗎?

您是單引號整個表達式,所以不會發生 shell 插值,Perl 會看到最奇怪的"$( - "printf “%d” ${j}正則表達式," - )"它被 Perl 插值成類似的東西

% perl -E 'say qq{"$( - "`printf "%d" ${j}`" - )"}'
"42 640 - "`printf "%d" `" - )"
% 

因為您要求 Perl 插入$(您可以通過perldoc -v '$('. 可以說,這個正則表達式可能與您的文件不匹配。(並展示了嘗試將多種語言嵌入到一個極其複雜的字元串中的幾個陷阱之一;實際上沒有必要,因為 Perl 可以做到這一切。)

更好的方法是匹配和調整您感興趣的內容,這裡似乎是用連字元括起來的數字;假設文件名中只有一個數字,只需匹配保存反向引用([0-9]+)並使用Perlsprintf函式適當填充這些數字(加上重要/e標誌,將右側視為表達式,因此sprintf實際被呼叫)。

% touch "blah - "{1..9}" - blah"
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% rename 's/([0-9]+)/sprintf "%02d", $1/e' *
% ls
blah - 01 - blah    blah - 04 - blah    blah - 07 - blah
blah - 02 - blah    blah - 05 - blah    blah - 08 - blah
blah - 03 - blah    blah - 06 - blah    blah - 09 - blah
% 

如果文件名中的其他地方有數字,則使用正則表達式來說明這一點,可能類似於

% rename 's/- ([0-9]+) -/sprintf "- %d -", $1/e' *
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% 

rename要最有效地使用正則表達式,請參閱

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