Bash:重命名文件名的开头

Bash:重命名文件名的开头,bash,filenames,rename,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 cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \ 2_150901_AC7GLHANX

我有几个文件,看起来像这样:

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
cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \ 
    2_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
    > 150901_AC7GLHANXX_P2258_101_1.fastq.gz
$ ls | cut -b3- | sort -u | tee stems.lst # list the stems
$ while read stem; do cat *_$stem > $stem; done <stems.lst
。。。i、 例如,有两个文件以
1\u
开头,以
\u 1.fastq.gz
\u 2.fastq.gz
结尾,以
2\u
开头的两个文件也是如此。我想做的是
cat
\u 1.fastq.gz
结尾的两个文件,如下所示:

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
cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \ 
    2_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
    > 150901_AC7GLHANXX_P2258_101_1.fastq.gz
$ ls | cut -b3- | sort -u | tee stems.lst # list the stems
$ while read stem; do cat *_$stem > $stem; done <stems.lst
。。。以便合并它们并删除它们的前缀。我在比这个多得多的文件夹中有更多的文件,所以我想自动化它。我尝试了以下代码,但没有成功:

for f in *_*_1.fastq.gz
do
    cat $f "${f/^1_/2_}" > "${f/^1_/}"
done
我不认为我对这种替换方法了解得足够多,但这是我在过去对不太复杂的文件名所使用的方法(当它们只有不同的后缀x,并且没有前缀时)。我认为开头的
^
表示文件名的开始,但它似乎不像我希望的那样工作,所以很明显我做错了什么。我尝试了一些故障排除:

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
。。。这不是我想的那样。有人知道我怎么做吗

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

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

找到“1”,然后检查“2” 如果两者都存在,则将它们组合在一起并删除零件

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

如果我处于y位置,假设目录中只有这种格式的文件,我会执行如下过程:

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
cat 1_150901_AC7GLHANXX_P2258_101_1.fastq.gz \ 
    2_150901_AC7GLHANXX_P2258_101_1.fastq.gz \
    > 150901_AC7GLHANXX_P2258_101_1.fastq.gz
$ ls | cut -b3- | sort -u | tee stems.lst # list the stems
$ while read stem; do cat *_$stem > $stem; done <stems.lst
$ls | cut-b3-| sort-u | tee stemes.lst#列出这些stemes

$whilereadstem;执行cat*$stem>$stem;在这种情况下,字符串锚点的开头是
#
字符,而不是
^
。请参阅(您必须滚动到包含
${parameter/pattern/string}
展开的部分的相关部分)。啊,好的!是的,
#
在这种情况下确实有效,谢谢!成功了,非常感谢!我还必须将for循环更改为
1.*.*.fastq.gz
,因为我只得到
\u 1.fastq.gz
文件,而不是
\u 2.fastq.gz
,但这是我在这个问题上的最初错误。