删除文件名中间

C. *_*eid 3 bash rename sed

我在 bash 中有一个这样的文件名列表

UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R1.fq.gz
UTSHoS10_Other_CAAGCC-TTAGGA_R_160418.R2.fq.gz
UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz
UTSHoS11_Other_AGGCCT-TTAGGA_R_160418.R2.fq.gz
UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R1.fq.gz
UTSHoS12_Other_GGCAAG-TTAGGA_R_160418.R2.fq.gz
Run Code Online (Sandbox Code Playgroud)

我希望它们看起来像这样

UTSHoS10_R1.fq.gz
UTSHoS10_R2.fq.gz
UTSHoS11_R1.fq.gz 
UTSHoS11_R2.fq.gz
UTSHoS12_R1.fq.gz
UTSHoS12_R2.fq.gz
Run Code Online (Sandbox Code Playgroud)

我没有 perlrename命令并且sed 's/_Other*160418./_/' *.gz 没有做任何事情。我在这里尝试了其他重命名脚本,但要么什么也没有发生,要么我的 shell 开始向控制台打印大量代码并冻结。

这篇文章(删除文件名的中间部分)类似,但是给出的答案没有解释命令的特定部分正在做什么,所以我无法将其应用于我的问题。

mkl*_*nt0 5

参数扩展bash可以基于类似 glob 的模式执行字符串替换,这比调用额外的外部实用程序(例如sed在每个循环迭代中)提供更有效的解决方案:

for f in *.gz; do echo mv "$f" "${f/_Other_*-TTAGGA_R_160418./_}"; done
Run Code Online (Sandbox Code Playgroud)

删除echo之前的内容mv以执行实际的重命名。