ファイル名の一部を無視する方法

ファイル名の一部を無視する方法

この質問が以前にリクエストされた場合は申し訳ありません。私はこれらすべてについて非常に新しいものです。

R1特定のファイル名の場所を含む他のフォルダ内のすべてのファイルをリンクしたいと思います。いくつかのファイル名が異なるため、これまでの試みは機能しません。S番号

フォルダ1

952_56890_S91_combined_L001_R1_001.fastq.gz
952_56890_S91_combined_L001_R2_001.fastq.gz
952_53929_S92_combined_L001_R1_001.fastq.gz
952_53929_S92_combined_L001_R2_001.fastq.gz

フォルダ2

952_56890_S125_combined_L001_R1_001.fastq.gz
952_56890_S125_combined_L001_R2_001.fastq.gz
952_53929_S126_combined_L001_R1_001.fastq.gz
952_53929_S126_combined_L001_R2_001.fastq.gz

答え1

$ cat 952_53929_S*R1._001.fastq.gz >> ファイル名

答え2

例の名前がいくつかある場合は、手動でこれを実行できます。

cat folder*/952_53929_S*_R1_*.fastq.gz > 952_53929_combined_L001_R1_001.fastq.gz
cat folder*/952_53929_S*_R2_*.fastq.gz > 952_53929_combined_L001_R2_001.fastq.gz
cat folder*/952_56890_S*_R1_*.fastq.gz > 952_56890_combined_L001_R1_001.fastq.gz
cat folder*/952_56890_S*_R2_*.fastq.gz > 952_56890_combined_L001_R2_001.fastq.gz

もっと多ければあまり実用的ではありません。したがって、名前を直接収集できます。

$ for f in */952_*.fastq.gz; do fname=$(basename "$f"); echo ${fname%%_S*} ; done | sort | uniq
952_53929
952_56890

これにより、次のタスクを実行できるプレフィックスが提供されます。

for f in */952_*.fastq.gz; do 
    fname=$(basename "$f"); 
    echo ${fname%%_S*} ; 
done | 
    sort | 
        uniq | 
            while read prefix; do 
                cat */"$prefix"*_R1_*.fastq.gz > "$prefix"_combined_L001_R1_001.fastq.gz; 
                cat */"$prefix"*_R2_*.fastq.gz > "$prefix"_combined_L001_R2_001.fastq.gz; 
            done

関連情報