【问题标题】:Renaming multiples files with a bash loop使用 bash 循环重命名多个文件
【发布时间】:2012-02-12 12:33:16
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: bash for-loop batch-rename


    【解决方案1】:

    这里有几个错误:

    • 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

    【讨论】:

    • @Chris Dodd:虽然事后养成好习惯很有用。
    • 一个人的优点就是另一个人的缺点——鼓励在文件名(或以-开头的文件)中使用空格不是一件好事。
    • 为什么不是好事?因为程序员并不总是正确地处理它们?要求计算机工作站的最终用户从他们的文件名中删除所有空格、破折号和非字母数字字符,并观察他们的反应 :) 作为程序员,我们的工作是适应我们工作的系统的可能性。至于以-开头的文件,为什么我不能命名一个以负数开头的文件?
    • mv -- 是做什么的?我找到了elsewhere,但不知道它的作用。
    • @Josh -- 表示选项解析结束。因此,例如,如果您有一个名为 -i 的文件,mv -- -i … 将起作用,因为 -i 不会被解释为开关。
    【解决方案2】:
    for f in chr*.fasta; do mv "$f" "${f/%.fasta/.fa}"; done
    

    【讨论】:

    • 虽然这适用于给定的数据,但文件中的空格或文件名中包含.fasta 而不仅仅是扩展名的文件呢?很多事情都可能在这里出错
    • 在我发表上述评论之前固定使用/% ;)
    • 好的,考虑到 OP 的示例,我添加了引号,即使它们几乎肯定不需要。名称中也不可能有任何虚假句点。
    • @Chris Dodd:所以,现在你的答案和我的很相似 :) 总是引用是养成好习惯。我曾经懒惰地使用它们,有一天灾难来了。
    • 删除了反对票,因为带有空格的文件问题已修复。教导他人时始终使用最佳实践!
    【解决方案3】:

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

    rename .fasta .fa chr*.fasta
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2021-12-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多