用于删除文件名中特定字符的 bash 代码是什么?

用于删除文件名中特定字符的 bash 代码是什么?

我有一组字符不同的文件。例如:

IDNR19_15_037_S514_L001_R1_001.fastq
IDNR19_02_016_S238_L001_R1_001.fastq

我想删除S514和之前的所有字符S238,同时保留后面的所有字符。当文件具有不同的编号(如我的示例所示)时,可以这样做吗?

大约有 1,100 个文件,因此手动执行此操作将非常耗时。

我能做的最接近的是:

rename 's/IDNR19_//g' *.fastq

删除 IDNR19_ 部分,但这并不能解决我的问题。

答案1

假设这些是磁盘上要重命名的文件的名称,而不是存储在变量或文本文件中的字符串。您可以使用一个简单的 shell 循环:

for name in *.fastq; do
    newname=${name#*_*_*_}
    printf 'Would move "%s" to "%s"\n' "$name" "$newname"
    # mv -i -- "$name" "$newname"
done

这会循环遍历*.fastq当前目录中与该模式匹配的所有名称(您可能希望通过将其更改为 来更具体地了解该模式IDNR*.fastq)。对于每个文件名,它通过删除与文件名通配模式匹配的前缀来构造一个新名称*_*_*_。这是使用完成的标准参数扩展

为了安全起见,mv已将其注释掉。在启用mv.

使用各种实用程序之一rename(基于 PerlFile::Rename模块的实用程序;有许多不同的实用程序,请参阅“所有重命名是怎么回事:预命名、重命名、文件重命名?”):

rename -n -v 's/.*?_.*?_.*?_//' -- *.fastq

或者更短,

rename -n -v 's/(.*?_){3}//' -- *.fastq

这或多或少与上面的 shell 代码执行相同的操作,但使用 Perl 替换。替换通过使用非贪婪.*匹配来匹配下划线之间的三个子字符串,从而删除文件名字符串的初始位。-n当您确信该选项可以做正确的事情时,请删除该选项。

相关内容