28

我需要重命名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

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

谢谢!

4

3 回答 3

36

这里有几个错误:

  • 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

于 2012-01-17T17:41:17.097 回答
13
for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
于 2012-01-17T17:42:21.180 回答
7

如果你有rename命令,你可以这样做:

rename .fasta .fa chr*.fasta
于 2012-01-17T17:45:48.050 回答