使用bash循环重命名多个文件

时间:2012-01-17 17:38:56

标签: bash for-loop batch-rename

我需要重命名45个文件,我不想一个接一个地执行。这些是文件名:

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

但它不起作用。你能告诉我为什么,或者给出另一个快速解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分:26)

这里有几个错误:

  • 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}“仅在变量的末尾查找pat ,并将其替换为replacement

答案 1 :(得分:9)

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

答案 2 :(得分:7)

如果您有rename命令,则可以执行以下操作:

rename .fasta .fa chr*.fasta