Bash:重命名文件名的开头

时间:2015-09-15 08:13:33

标签: bash filenames rename

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

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

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

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

......这不是我想的那样。有谁知道我怎么能这样做?

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

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

2 个答案:

答案 0 :(得分:2)

找到" 1"然后检查" 2" s 如果它们都在一起并删除它们。

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

答案 1 :(得分:0)

如果我在我们的位置,假设目录中只有这种格式的文件,我会选择这样的程序:

$ 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 > $stem",然后再替换它真实的东西。
  • 不要忘记之后移除stem.lst
  • 如果它稳定且您需要重复,您可以直接从sort -uwhile
  • 管道词干列表
  • (如果此问题对相同情况下的其他人有用),如果您的文件名包含任何奇怪的内容,请在$stem行中的while行的ALL附近加双引号
相关问题