2012-01-17 104 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