【问题标题】:Bash: rename beginning of filename [duplicate]Bash:重命名文件名的开头[重复]
【发布时间】:2015-12-11 09:49:51
【问题描述】:

我有几个文件,如下所示:

1_150901_AC7GLHANXX_P2258_101_1.fastq.gz
1_150901_AC7GLHANXX_P2258_101_2.fastq.gz
2_150901_AC7GLHANXX_P2258_101_1.fastq.gz
2_150901_AC7GLHANXX_P2258_101_2.fastq.gz

...即,有两个以1_ 开头并以_1.fastq.gz_2.fastq.gz 结尾的文件,对于以2_ 开头的两个文件也是如此。我要做的是cat这两个以_1.fastq.gz结尾的文件,像这样:

cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \ 
    2_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
    > 150901_AC7GLHANXX_P2258_101_1.fastq.gz

... 以便将它们合并并删除它们的前缀。我在比这更多的文件夹中有更多的文件,所以我想自动化它。我尝试了以下代码,但无济于事:

for f in *_*_1.fastq.gz
do
    cat $f "${f/^1_/2_}" > "${f/^1_/}"
done

我认为我不太了解这种替换方法,但它是我过去用于不太复杂的文件名的方法(当它们只有不同的后缀,没有前缀时)。我认为开头的^ 表示文件名的开始,但它似乎不像我想要的那样工作,所以很明显我做错了什么。我尝试进行一些故障排除:

for f in *_*_1.fastq.gz
    do
        echo "${f/^1_/}"
    done

...给我...

1_150901_AC7GLHANXX_P2258_101_1.fastq.gz
2_150901_AC7GLHANXX_P2258_101_1.fastq.gz

...这不是我想的那样。有人知道我该怎么做吗?

[编辑,澄清非重复问题]

这个问题与我之前的问题不同,我还有一个文件名前缀,而且这个前缀也存在于文件名的中间。另一个问题有一个更简单的情况,只有一个后缀是需要重命名的。

【问题讨论】:

  • 在此上下文中,字符串锚点的开头是# 字符,而不是^。请参阅relevant section of the manual(您必须滚动到涵盖${parameter/pattern/string} 扩展部分的相关部分)。
  • 啊,好吧!是的,# 在这种情况下确实有效,谢谢!

标签: bash filenames rename


【解决方案1】:

如果我处于我们的位置,假设目录中只有这种格式的文件,我会采用这样的程序:

$ ls | cut -b3- | sort -u | tee stems.lst # list the stems
$ while read stem; do cat *_$stem > $stem; done <stems.lst

在上线之前在测试目录中试试这个,否则你会弄乱文件名并且恢复起来会很痛苦。

结束语:

  • 技巧:由于重定向,这里有点不方便,但首先在非破坏性模式下尝试while 命令更安全,方法是先运行某种形式的echo "cat *_$stem &gt; $stem",然后再用真实的东西替换它。
  • 之后别忘了删除stem.lst
  • 如果它是稳定的并且你需要重复,你可以直接从sort -uwhile
  • (如果此问题对处于相同情况的其他人有用)如果您的文件名包含任何奇怪的内容,请在 while 行中的任何位置用双引号将 $stem 括起来

【讨论】:

    【解决方案2】:

    找到“1”然后检查“2” 如果两者都 cat 它们一起并删除部分。

    for f in 1_*_1.fastq.gz
    do
          g="2_${f#1_}"
          if [ -f "$g" ]
          then
                cat "$f" "$g" > "${f#1_}" && rm "$f" "$g"
          fi
    done
    

    【讨论】:

    • 做到了,非常感谢!我还必须将 for 循环更改为 1_*_*.fastq.gz,因为我只获得了 _1.fastq.gz 文件而不是 _2.fastq.gz,但这是我最初的问题。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-02-18
    • 2016-08-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多