2012-08-16 45 views
3

我有這樣的文件(幾千條)的列表:如何批量移動預置年份到文件名的末尾?

/path/2010 - filename.txt 
/path/2011 - another file name.txt 

總是遵循這個模式:#### - string.txt

我需要改變他們看起來像這樣:

/path/filename (2010).txt 
/path/another file name (2011).txt 

我怎樣才能用bash,shell,terminal等快速做到這一點?

回答

3

未經測試。

find /path -name '???? - *.txt' -print0 | while read -d ''; do 
    [[ $REPLY =~ (.*)/(....)\ -\ (.*)\.txt$ ]] || continue 

    path=${BASH_REMATCH[1]} 
    year=${BASH_REMATCH[2]} 
    str=${BASH_REMATCH[3]} 
    echo mv "$REPLY" "$path/$str ($year).txt" 
done 

取出echo一旦產生mv命令看的權利。

+0

如何添加斜線以避開路徑和文件名中的空格? – Ryan 2012-08-16 16:16:39

+0

(。*)應該貪婪地匹配所有內容,直到最後的斜線,空格和全部。 '\'正在轉義文件名中的空格。我不認爲應該有任何其他空間問題。 – chepner 2012-08-16 16:30:02

+0

Doh,未轉義的空格只出現在回顯中。 Mv工作得很好。謝謝。給你「答案」,因爲它沒有另一個圖書館。再次感謝。 – Ryan 2012-08-16 16:46:50

5

嘗試rename命令:

rename -n 's/(.*) - (.*)(\.txt)/$2 ($1)$3/' *.txt 

-n(--no-ACT)選項進行預覽。
刪除-n以執行替換。

+0

拍攝,我的Mac沒有重命名('-bash:rename:command not found')。我可以用'mv'來做這個嗎? – Ryan 2012-08-16 16:00:53

+1

如果'* .txt'擴展爲一個命令行的文件太多,'find/path -name'* .txt'-print0 | xargs -0 rename -n ...' – chepner 2012-08-16 16:01:08

+0

'rename'是一個很小的perl腳本。我認爲你可以將它安裝在MAC中。 – kev 2012-08-16 16:03:38

1

我知道你沒有用zsh標記它,但你確實說了shell。反正這裏是如何與zmv功能做在zsh

autoload zmv      # It's not loaded by default 
zmv -nvw '* - *.*' '$2 ($1).$3' 

刪除-n當你滿意的輸出。

-v使zmv冗長。 -w隱含地製作一組每個通配符。

相關問題