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

标签 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

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

谢谢!

最佳答案

这里有几个错误:

  • 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/

相关文章:

powershell - 如何将文件从一个文件夹批量复制并重命名到另一个文件夹?

batch-file - 如何批量使用.txt文件中的新名称重命名路径中的文件?

bash - 端口监听使用/dev/tcp

用于分割和反转文件名的 bash 脚本

bash - 如何从 shell 调用 .bashrc 中定义的函数?

Javascript 循环数组以查找可被 3 整除的数字

Python-Tkinter,for循环创建图片按钮

bash - 你怎么知道 bash 是否正在从远程机器访问?

C:程序在完成 for 循环之前崩溃

android - 在 Android 上重命名帐户 (AccountManager)