![重命名文件夹内的文件](https://linux22.com/image/121165/%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有几个文件夹,每个文件夹包含两个文件 fastq.gz。通常它们被命名为sample_R1.fastq.gz和sample_R2.fastq.gz。其中sample_可以代表文件夹名称或其他名称。
但就我而言,文件夹是:
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