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

Gep*_*ada 21 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
Run Code Online (Sandbox Code Playgroud)

我需要将扩展​​名".fasta"更改为".fa".我正在尝试编写一个bash脚本来执行此操作:

for i in $(ls chr*)

do

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

mv $i $NEWNAME

done
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Ben*_*oit 29

这里有几个错误:

  • NEWNAME =应该没有空间.这里bash正在寻找命名的命令NEWNAME,但失败了.
  • 你解析ls的输出.如果你有空格的文件,这是不好的.Bash可以使用glob运算符构建自己的文件列表*.
  • 你不要逃避"$i""$NEWNAME".如果它们中的任何一个包含空格,则为mv创建两个参数.
  • 如果文件名以短划线开头,mv则认为它是一个开关.使用--停止参数处理.

尝试:

for i in chr*
do
  mv -- "$i" "${i/%.fasta/.fa}"
done
Run Code Online (Sandbox Code Playgroud)

要么

for i in chr*
do
  NEWNAME="${i/%.fasta/.fa}"
  mv -- "$i" "$NEWNAME"
done
Run Code Online (Sandbox Code Playgroud)

"%{var/%pat/replacement}"查找pat 末只有变量,并替换它replacement.

  • 一个人的美德是另一个男人的恶习 - 鼓励在文件名(或以`-`开头的文件)中使用空格并不是一件好事. (2认同)
  • @Josh `--` 表示选项解析结束。因此,如果您有一个名为“-i”的文件,则“mv -- -i …”将起作用,因为“-i”不会被解释为开关。 (2认同)

Chr*_*odd 9

for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
Run Code Online (Sandbox Code Playgroud)


dog*_*ane 7

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

rename .fasta .fa chr*.fasta
Run Code Online (Sandbox Code Playgroud)