批次檔重命名腳本交換檔名中的子字串?

批次檔重命名腳本交換檔名中的子字串?

我有一組名為title_december_word1_word2.png並希望遍歷目錄並在每個文件內交換word1和。word2

即從button_december_state_pressed.png->button_december_pressed_state.png

關於我如何實現這一目標有什麼建議嗎?

我發現的大多數 OS X 批次程式都無法指定一個字元來分解單詞,我希望有人可以幫助我使用一個快速腳本來解決這個問題。

答案1

在bash中,可以如下完成:

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

該命令首先查找當前目錄中的所有文件,然後提供這些名稱(它假設沒有檢查有三個下劃線和一個 .在這些檔案名稱中)轉換為 awk,它會按照您想要的順序重新排列它們。

唯一棘手的部分是-F'[_.]'該選項-F' '用於標識不同欄位之間的分隔符,在最後一種情況下,分隔符號採用預設值,即空格。但此選項-F'[_.]'定義了可互換元素的字元類,在本例中是底線和點,可以隨意用作分隔符。

編輯:

好的,由於這有效,無需實際移動任何內容,我們現在可以實現重命名文件的實際操作:

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

答案2

茲什和zmv

如果您有 zsh(OS X 中預設),您可以使用zmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

將執行以下命令(用於zmv -n進行試運行而不實際重命名):

mv -- title_december_word1_word2.png title_december_word2_word1.png

顯然,如果每個圖像的第一部分不同,您可以更加靈活:

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

這是有效的,因為匹配是貪婪的,因此會吞掉所有下劃線,直到其他匹配組之前的最後一個。


Perl風格rename

在 OS X 上你可以取得rename自製:

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

-n選項僅列印已重新命名的內容。

相關內容