2016-03-16 127 views
1

我在文件夾中有一些多個文件我想縮短名稱。以下是輸入文件在unix中重命名文件夾中的多個文件

輸入

S_12_O_319_K27ac_S12818.sorted.bam 
S_12_O_319_K27me3_S12815.sorted.bam 
S_12_O_319_K4me1_S12816.sorted.bam 
S_12_O_319_K4me3_S12817.sorted.bam 
S_14_AS_11_K27ac_S12843.sorted.bam 
S_14_AS_11_K27me3_S12840.sorted.bam 
S_14_AS_11_K4me1_S12841.sorted.bam 
S_14_AS_11_K4me3_S12842.sorted.bam 
S_12_O_319_K27ac_S12818.sorted.bam.bai 
S_12_O_319_K27me3_S12815.sorted.bam.bai 
S_12_O_319_K4me1_S12816.sorted.bam.bai 
S_12_O_319_K4me3_S12817.sorted.bam.bai 
S_14_AS_11_K27ac_S12843.sorted.bam.bai 
S_14_AS_11_K27me3_S12840.sorted.bam.bai 
S_14_AS_11_K4me1_S12841.sorted.bam.bai 
S_14_AS_11_K4me3_S12842.sorted.bam.bai 

輸出

S_12_O_319_K27ac.bam 
S_12_O_319_K27me3.bam 
S_12_O_319_K4me1.bam 
S_12_O_319_K4me3.bam 
S_14_AS_11_K27ac.bam 
S_14_AS_11_K27me3.bam 
S_14_AS_11_K4me1.bam 
S_14_AS_11_K4me3.bam 
S_12_O_319_K27ac.bam.bai 
S_12_O_319_K27me3.bam.bai 
S_12_O_319_K4me1.bam.bai 
S_12_O_319_K4me3.bam.bai 
S_14_AS_11_K27ac.bam.bai 
S_14_AS_11_K27me3.bam.bai 
S_14_AS_11_K4me1.bam.bai 
S_14_AS_11_K4me3.bam.bai 

請注意,我的文件有兩個不同的擴展,一個是* .bam另一個是* .bam.bai。我想立刻重新命名它們以縮短名稱。從中刪除部分_S12843.sorted。請注意,這是第5個下劃線,而_S12843後面的數字對於不同的文件是不同的。只有類似的模式是字符串sorted。所以想截斷整個部分來縮短名稱。我怎樣才能用bash或者重命名或者sed來實現。任何幫助,將不勝感激。我能夠刪除字符串與排序但不是數字。

+0

[批量使用bash重命名]可能的複製(http://stackoverflow.com/questions/602706/batch-renaming-with-bash) – n00dl3

回答

3

使用rename工具,你可以這樣做:

rename 's/_[^_.]+\.sorted//' *.sorted.* 

如果沒有rename不要再使用此for循環:

for f in *.sorted.*; do 
    mv "$f" "${f/_S[[:digit:]]*.sorted}" 
done 
+1

他們兩人的作品,因爲它消耗更少的時間,所以更喜歡循環中的一個。我沒有新的這個'[:digit:]'的東西。你能向我解釋一次嗎? –

+1

'[[:digit:]]'是POSIX屬性,用於匹配全局或正則表達式中的數字[0-9]' – anubhava

+0

嗯好了唯一的問題是確定'_S'理想情況下它也可以工作'for f在* .sorted。*中;做mv「$ f」「$ {f/_S [[0-9]] *。sorted}」;完成' –

0

這可能爲你工作(GNU SED):

sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/e' file 

或者:

sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/' file | shell 

其中shell可能是bash