我有一組名為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
$ 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
選項僅列印已重新命名的內容。