我希望更改一批文件名以删除字母,如下所示:
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
如果你有rename
(prename
):
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
后跟.
(文件扩展名之前)