如何从文件名中删除一个字符/字母

如何从文件名中删除一个字符/字母

我希望更改一批文件名以删除字母,如下所示:

Stain-A_1P.fastq  to Strain-A_1.fastq
Strain-A_2P.fastq  to  Strain-A_2.fastq

我已经尝试过以下方法:

rename 's/P//' *fastq
for file in *; do mv "$file" `echo $file | tr 'P' ''` ; done

答案1

使用bash或任何其他 POSIX shell:

for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done
  • for f in *.fastq迭代.fastq文件

  • ext="${f##*.}"gets ( ${f##*.}) 并将文件的扩展名保存为变量ext

  • ${f%?.*}获取最后一个字符之后的字符部分.

  • mv "$f" "${f%?.*}.${ext}"执行重命名操作,并附加带有裁剪后的前缀的扩展名

这是一次预演;下降echo实际行动:

for f in *.fastq; do ext="${f##*.}"; mv -- "$f" "${f%?.*}.${ext}"; done

如果你有renameprename):

rename -n 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq
  • 我们利用贪婪匹配来.*匹配最后的部分.

  • 第一个捕获的组包含直到倒数第二个字符之前的部分.

  • 第二个捕获组包含最后一个之后的部分.(包括.

放下-n实际行动:

rename 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq

例子:

% ls -1d -- *.fastq
Stain-A_1P.fastq
Strain-A_2P.fastq

% for f in *.fastq; do ext="${f##*.}"; echo mv -- "$f" "${f%?.*}.${ext}"; done 
mv -- Stain-A_1P.fastq Stain-A_1.fastq
mv -- Strain-A_2P.fastq Strain-A_2.fastq

% rename -n 's{^(./.*).(\..*)}{$1$2}s' ./*.fastq
rename(./Stain-A_1P.fastq, ./Stain-A_1.fastq)
rename(./Strain-A_2P.fastq, ./Strain-A_2.fastq)

答案2

使用rename命令:

for f in *.fastq; do rename 's/P\./\./' "$f" ; done

  • 's/P\./\./-珀尔替换表达式:删除P后跟.(文件扩展名之前)

相关内容