![用于删除文件名中特定字符的 bash 代码是什么?](https://linux22.com/image/169414/%E7%94%A8%E4%BA%8E%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E7%9A%84%20bash%20%E4%BB%A3%E7%A0%81%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我有一组字符不同的文件。例如:
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
当您确信该选项可以做正确的事情时,请删除该选项。