我有大量文件,它们的文件名需要简化。我需要保留第一个 _ 和 _R1/R2 位之前的所有内容。
A10_S65_L001_R1_001.fastq
A8_S49_L001_R2_001.fastq
B7_S42_L001_R1_001.fastq
C5_S27_L001_R2_001.fastq
F4_S22_L001_R1_001.fastq
G2_S7_L001_R2_001.fastq
H1_S165_L001_R1_001.fastq
A10_S65_L001_R2_001.fastq
A9_S57_L001_R1_001.fastq
B7_S42_L001_R2_001.fastq
C6_S35_L001_R1_001.fastq
F4_S22_L001_R2_001.fastq
G3_S15_L001_R1_001.fastq
H1_S165_L001_R2_001.fastq
因此第一个例子是 ----> A10_R1.fastq
我已经能够使用rename 's/*L001//' *L001*.fastq
它来删除部分内容,但由于第一个 _ 之前的字符长度会有所不同,因此变得很复杂。我真的很感激您的帮助!
谢谢你!
答案1
这可以通过多种方式来实现...下面我将列出三种方法作为示例。
第一种方式
使用mmv
:
mmv -n -- '*_*_*_*_*.fastq' '#1_#4.fastq'
'*_*_*_*_*.fastq'
将对当前工作目录中所有带有扩展名的文件进行操作,使用指定的分隔符.fastq
将文件名拆分为多个部分(其中为),即...然后按编号调用这些部分(第一个为)以形成新文件名,即...该选项用于空运行(模拟但不进行实际重命名)...当对输出满意时删除以进行实际重命名。*
_
#
#1
'#1_#4.fastq'
-n
-n
第二种方式
使用rename
:
rename -n 's/^([^.]+)\_([^.]+)\_([^.]+)\_([^.]+)\_([^.]+)\.fastq$/$1_$4.fastq/' *.fastq
请参见这个答案(这解释部分)来解释它的工作原理,此链接正则表达式分解...该-n
选项用于空运行(模拟但没有进行实际重命名)...-n
当对输出满意时删除以进行实际重命名。
第三条道路
使用mv
和bash 数组在一个bash for 循环在 bash shell 脚本文件中:
#!/bin/bash
for f in *.fastq; do # Work on files with ".fastq" extention in the current working directory assigning their namese one at a time(for each loop run) to the fariable "$f"
IFS='_.' read -r -a array <<< "$f" # Split filename into parts/elements by "_" and "." and read the elements into an array
f1="${array[0]}_${array[3]}.${array[5]}" # Set the new filename in the variable "$f1" by sellecting certain array elements and adding back "_" and "."
echo mv -- "$f" "$f1" # Renaming dry-run(simulation) ... Remove "echo" when satisfied with output to do the actual renaming.
done
或者在 bash 命令字符串中:
bash -c `for f in *.fastq; do IFS='_.' read -r -a array <<< "$f"; f1="${array[0]}_${array[3]}.${array[5]}"; echo mv -- "$f" "$f1"; done`