2012-01-17 38 views
15

我需要重命名45個文件,而且我不想一個接一個地完成。這些是文件名:用bash循環重命名多個文件

chr10.fasta   chr13_random.fasta chr17.fasta   chr1.fasta   chr22_random.fasta chr4_random.fasta chr7_random.fasta chrX.fasta 
chr10_random.fasta chr14.fasta   chr17_random.fasta chr1_random.fasta chr2.fasta   chr5.fasta   chr8.fasta   chrX_random.fasta 
chr11.fasta   chr15.fasta   chr18.fasta   chr20.fasta   chr2_random.fasta chr5_random.fasta chr8_random.fasta chrY.fasta 
chr11_random.fasta chr15_random.fasta chr18_random.fasta chr21.fasta   chr3.fasta   chr6.fasta   chr9.fasta   
chr12.fasta   chr16.fasta   chr19.fasta   chr21_random.fasta chr3_random.fasta chr6_random.fasta chr9_random.fasta 
chr13.fasta   chr16_random.fasta chr19_random.fasta chr22.fasta   chr4.fasta   chr7.fasta   chrM.fasta 

我需要將擴展​​名「.fasta」更改爲「.fa」。我試着寫一個bash腳本來做到這一點:

for i in $(ls chr*) 

do 

NEWNAME = `echo $i | sed 's/sta//g'` 

mv $i $NEWNAME 

done 

但它不工作。你能告訴我爲什麼,或者提供另一種快速解決方案嗎?

謝謝!這裏

回答

20

幾個誤區:

  • NEWNAME =應該沒有空間。這裏bash正在尋找名爲NEWNAME的命令並且失敗。
  • 你解析ls的輸出。如果你有空格的文件,這是不好的。 Bash可以使用glob運算符*構建一個文件列表。
  • 你不會逃脫"$i""$NEWNAME"。如果它們中的任何一個包含空格,則它爲mv創建兩個參數。
  • 如果文件名以短劃線開頭mv會認爲它是一個開關。使用--停止參數處理。

嘗試:

for i in chr* 
do 
    mv -- "$i" "${i/%.fasta/.fa}" 
done 

for i in chr* 
do 
    NEWNAME="${i/%.fasta/.fa}" 
    mv -- "$i" "$NEWNAME" 
done 

"%{var/%pat/replacement}「只有在最後的變量尋找patreplacement替換它

+0

我不應該刪除我的意見,但我看到您在上述回答。謝謝。 – nickd 2012-01-17 17:48:58

+0

不錯,使用'/%'和' - '作爲'mv'。我可能會在'for'循環中包含擴展名,'我在chr * .fasta'中包含 – c00kiemon5ter 2012-01-17 17:49:39

+0

感謝您的完整解答! – Geparada 2012-01-17 17:50:28

7
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done 
+0

將不起作用,如果文件名稱中有空格。 – Benoit 2012-01-17 17:45:23

+0

+1,各種選擇 – bobah 2012-01-17 17:48:09

+0

雖然這可以與給定的數據一起工作,那麼文件中的空格或文件中包含'.fasta'的文件不僅僅作爲它們的擴展名?很多事情在這裏可能會出錯 – c00kiemon5ter 2012-01-17 17:51:32

6

如果你有rename命令,你可以這樣做:

rename .fasta .fa chr*.fasta 
+0

我將在下次使用該命令,謝謝! – Geparada 2012-01-17 17:54:17