我需要重命名 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
但它不起作用。你能告诉我为什么,或者给出另一个快速解决方案吗?
谢谢!
最佳答案
这里有几个错误:
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
仅在变量的末尾并将其替换为替换
。
关于bash - 使用 bash 循环重命名多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899135/