2つのfastq.gzファイルを含む複数のフォルダがあります。通常、名前はSample_R1.fastq.gzとSample_R2.fastq.gzです。ここで、サンプル_はフォルダ名または他の名前を表すことができます。
しかし、私の場合、フォルダは次のようになります。
1008_a
2085_a
2130_a
2192_a
2221_a
2242_a
2269_a
2482_a
各フォルダには次のファイルが含まれています。
1008_aファイル: C85CBANXX_s6_1_O07_0452_SL137634.fastq.gz C85CBANXX_s6_2_O07_0452_SL137634.fastq.gz
2085_a:
C7V65ANXX_s6_1_M19_0413_SL131164.fastq.gz C7V65ANXX_s6_2_M19_0413_SL131164.fastq.gz
このファイルの名前を次のように変更するにはどうすればよいですか?1008_a_R1.fastq.gz & 1008_a_R2.fastq.gz フォルダ1008_aの場合
2085_a_R1.fastq.gz ,2085_a_R2.fastq.gz フォルダ2085_aの場合
など、他のすべてのフォルダには、内部にさまざまな種類のパターンがあります。
ありがとう、ロン
答え1
find
+bash
解決策:
フォルダ構造の例(例:1080_a
と2085_a
):
$ tree 1008_a/ 2085_a/
1008_a/
├── C85CBANXX_s6_1_O07_0452_SL137634.fastq.gz
└── C85CBANXX_s6_2_O07_0452_SL137634.fastq.gz
2085_a/
├── C7V65ANXX_s6_1_M19_0413_SL131164.fastq.gz
└── C7V65ANXX_s6_2_M19_0413_SL131164.fastq.gz
働く:
find . -type f -regextype posix-egrep \
-regex ".*/[0-9]{4}_a/[[:alnum:]_]+_[12]_[[:alnum:]_]+\.fastq\.gz$" -exec bash -c \
'path=${0%/*}/; bn=${0##*/}; dir_n=${0%/*}; dir_n=${dir_n##*/};
new_fn=$(sed -E "s/.+_([12])_.+(\.fastq\.gz)$/${dir_n}_R\1\2/" <<<"$bn");
mv "$0" "$path$new_fn"' {} \;
結果:
$ tree 1008_a/ 2085_a/
1008_a/
├── 1008_a_R1.fastq.gz
└── 1008_a_R2.fastq.gz
2085_a/
├── 2085_a_R1.fastq.gz
└── 2085_a_R2.fastq.gz