2013-03-21 106 views
0

我有一大堆的目錄,例如重命名多個目錄一次

2013_03_12_18_26_am 
2013_03_12_18_26_cu 
2013_03_12_18_26_ig 
2013_03_12_18_26_mdf 
2013_03_12_18_26_pih 
2013_03_12_18_26_tn 
2013_03_12_18_26_an 
2013_03_12_18_26_cv 
2013_03_12_18_26_ik 
2013_03_12_18_26_mhr 
2013_03_12_18_26_pnb  
2013_03_12_18_26_to 

的什麼我想要做的就是它們重命名爲他們的最後兩個字符,例如: 2013_03_12_18_26_am到我, 我知道我可以一個接一個地做mv 2013_03_12_18_26_am am但這需要很長時間。這可以從shell腳本中實現嗎?

我希望在最後一個「_」之後的所有內容成爲新目錄的名稱。

+1

有時候,也有最後'_'後三個字符。你確定你想要最後兩個字嗎? – choroba 2013-03-21 16:57:27

+0

對不起,我想在最後的每一件事_ – 2013-03-21 16:58:38

回答

1

這個假設你的所有文件夾都在一個目錄中(並且只有全部)。所以,要小心......

原文:

marks-mac-pro:test mstanislav$ ls 
2013_03_12_18_26_am 2013_03_12_18_26_an 2013_03_12_18_26_cu 2013_03_12_18_26_cv  2013_03_12_18_26_ig 2013_03_12_18_26_ik 2013_03_12_18_26_mdf 2013_03_12_18_26_mhr 2013_03_12_18_26_pih 2013_03_12_18_26_pnb 2013_03_12_18_26_tn 2013_03_12_18_26_to 

Shell腳本:

marks-mac-pro:test mstanislav$ for i in `ls .`; do NEW=`echo $i | cut -d_ -f6`; mv $i $NEW; done 

結果:

marks-mac-pro:test mstanislav$ ls 
am an cu cv ig ik mdf mhr pih pnb tn to 

請做它的實際數據之前進行測試,只是確保;確定。再次,只能在一個目錄中進行此操作,只需要重命名文件夾,或者將第一部分重新編寫爲更具體的第一部分。

2

如果按照以上表格中的所有目錄,然後在bash,那麼你可以使用下面的變量subsitituion最終_

var=2013_03_12_18_26_am 
echo ${var##*_} #am 

後的字符提取然後,您可以重命名文件夾中的所有目錄:

for dir in *_*; do #as there may be more than 2 chars after final _ 
    new_dir=${dir##*_} 
    mv $dir $new_dir 
done 

當然,您需要添加檢查以確保您只是在移動目錄,而且您不覆蓋任何內容。

1
for d in *_?? 
do 
    newd=$(expr $d : '.*_\([a-z][a-z]*\)') 
    mv $d $newd 
done 
3

我注意到那些目錄名沒有空格或其他特殊字符。所以你可以嘗試:

ls|xargs -n1 |sed -r 's/(.*_)(.*)/mv & \2/' 

打印mv釐米爲你。如果你認爲所有的命令都是正確的,那麼你只需將它管到|sh

注意,ls部分,你可以改變只得到那些目錄。

+0

這是我的解決方案。一個使用所有正確的unix工具的單線程。 – 2013-03-21 17:18:55

+0

@JonathanCairns個人我覺得像xargs和sed在這種情況下有過度殺傷力,當時有完美的內置工具可以完成這項工作,但是對於他自己的工作。 – cmh 2013-03-21 17:44:45

+0

@cmh你是對的,它只是偏好,但我發現它嘗試從命令行使用bash構造(例如嘗試在合適的位置使用分號)是一個真正的痛苦。只要它完成了工作,雖然... – 2013-03-21 17:48:57

0

我喜歡這個重命名命令,這使Perl的正則表達式,像這樣:

rename 's/.*([a-z]{2})$/$1/' *