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
,但这是我在这个问题上的最初错误。