从多个文件名中删除字符

从多个文件名中删除字符

我有大量文件,它们的文件名需要简化。我需要保留第一个 _ 和 _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当对输出满意时删除以进行实际重命名。

第三条道路

使用mvbash 数组在一个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`

相关内容