【问题标题】:Rename files with loop variable name用循环变量名重命名文件
【发布时间】:2019-07-05 14:27:23
【问题描述】:

我正在尝试下载一堆文件并随时重命名它们。下载部分工作正常,但我不能让它重命名文件。这是我正在使用的脚本:

COUNTER=0
for (( i = 696; i <= 773; i++ ))
  do
  fastq-dump --split-3 --accession SRR546$i
mv SRR546"$i"_1 ./"$COUNTER"mVD_SRR546$i_1
mv SRR546"$i"_2 ./"$COUNTER"mVD_SRR546$i_2
gzip *.fastq

COUNTER=$[COUNTER + 1]
done

这将正确下载文件 SRR546696、SRR546697 等,但不会重命名它们。

我也尝试过使用:

rename 's/SRR/"$COUNTER"mVD_SRR/' *.fastq

但这也没有用。

【问题讨论】:

    标签: bash loops rename


    【解决方案1】:

    您需要将参数双引号以防止分词和通配符。同时需要保留{}的变量名:

    counter=0
    for ((i = 696; i <= 773; i++)); do
      fastq-dump --split-3 --accession "SRR546$i"
      mv "SRR546${i}_1" "./${counter}mVD_SRR546${i}_1"
      mv "SRR546${i}_2" "./${counter}mVD_SRR546${i}_2"
      gzip *.fastq
      ((counter++))
    done
    

    您可以使用一个变量来保存该字符串并使您的代码更具可读性,而不是在很多地方硬编码“SRR546”:

    counter=0 srr="SRR546"
    for ((i = 696; i <= 773; i++)); do
      fastq-dump --split-3 --accession "$srr$i"
      mv "$srr${i}_1" "./${counter}mVD_${srr}${i}_1"
      mv "$srr${i}_2" "./${counter}mVD_${srr}${i}_2"
      gzip *.fastq
      ((counter++))
    done
    

    改进:

    • 对普通变量使用小写字母(计数器而不是 COUNTER)
    • 使用引号来防止分词和通配(尽管在您的问题中这不是问题,因为变量包含一个数字,没有空格或其他元字符
    • 使用一组双引号而不是多个单引号
    • 使用 ++ 运算符来增加计数器,如 ((counter++)((...))better syntax 而不是 $[ ... ]

    您可能希望将error checking 添加到您的代码中。

    相关

    【讨论】:

    • 好答案,${parameter} 是必需的 "...when parameter is followed by a character which is not to be interpreted as part of its name."(man bash - 参数扩展)
    • @codeforester :我很惊讶$[ .... ] 在算术评估中也是合法的。我可以验证它 确实 工作,但我没有找到 bash 手册页中提到的这种语法(查看 Arithmetic ExpansionARITHMETIC EVALUATION)。这是 bash 的“隐藏功能”吗?
    • @user1934428 见Obsolete and deprecated syntax
    • @codeforester:有趣!我只查看了手册页,并且那里(为 Cygwin 构建的版本 4.4.12)没有关于弃用的章节(我不区分大小写地搜索了 obsoletedeprecate我>)。感谢您提供链接!
    【解决方案2】:

    当您将变量名与字符串组合时,只应引用字符串:

    COUNTER=0
    for (( i = 696; i <= 773; i++ )); do
    
        fastq-dump --split-3 --accession 'SRR546'$i
    
        mv 'SRR546'$i'_1' ./$COUNTER'mVD_SRR546'$i'_1'
        mv 'SRR546'$i'_2' ./$COUNTER'mVD_SRR546'$i'_2'
        gzip *.fastq
    
        COUNTER=$[COUNTER + 1]
    done
    

    【讨论】:

    • 不,这不是真的。 (比如说)字符串mVD_SRR546 中没有任何内容需要引用,所有字符都只是对shell 没有特殊含义的普通字符。但是,如果您不想要特殊含义(例如 ()*?$ 等加上所有空格),您可能希望引用具有特殊字符的字符串。至于变量,大多数情况下您应该双引号,主要是为了避免word splitting 包含空格。
    • 另见:When is double-quoting necessary? on unix.SE
    猜你喜欢
    • 2017-12-14
    • 2013-04-23
    • 1970-01-01
    • 2016-11-13
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多