Bash 在unix中重命名文件夹中的多个文件

Bash 在unix中重命名文件夹中的多个文件,bash,unix,awk,sed,file-rename,Bash,Unix,Awk,Sed,File Rename,我有一些多个文件在一个文件夹中,我想缩短名称。这是输入文件 输入 输出 S_12_O_319_K27ac.bam S_12_O_319_K27me3.bam S_12_O_319_K4me1.bam S_12_O_319_K4me3.bam S_14_AS_11_K27ac.bam S_14_AS_11_K27me3.bam S_14_AS_11_K4me1.bam S_14_AS_11_K4me3.bam S_12_O_319_K27ac.bam.bai S_12_O_319_K27me3.b

我有一些多个文件在一个文件夹中,我想缩短名称。这是输入文件

输入

输出

S_12_O_319_K27ac.bam
S_12_O_319_K27me3.bam
S_12_O_319_K4me1.bam
S_12_O_319_K4me3.bam
S_14_AS_11_K27ac.bam
S_14_AS_11_K27me3.bam
S_14_AS_11_K4me1.bam
S_14_AS_11_K4me3.bam
S_12_O_319_K27ac.bam.bai
S_12_O_319_K27me3.bam.bai
S_12_O_319_K4me1.bam.bai
S_12_O_319_K4me3.bam.bai
S_14_AS_11_K27ac.bam.bai
S_14_AS_11_K27me3.bam.bai
S_14_AS_11_K4me1.bam.bai
S_14_AS_11_K4me3.bam.bai

请注意,我的文件有两个不同的扩展名,一个是*.bam,另一个是*.bam.bai。我想一次重命名所有的名称,以缩短名称。将部分
\u S12843.从所有部分中移除。请注意,这是第5个下划线,而
\u S12843
后面的数字对于不同的文件是不同的。唯一相似的模式是字符串
排序
。因此,我想截断整个部分,以缩短名称。如何通过bash、rename或sed实现这一点。任何帮助都将不胜感激。我可以删除已排序的字符串,但不能删除数字

使用
重命名
实用程序,您可以执行以下操作:

rename 's/_[^_.]+\.sorted//' *.sorted.*
如果没有
重命名
,则将此
用于
循环:

for f in *.sorted.*; do
   mv "$f" "${f/_S[[:digit:]]*.sorted}"
done
这可能适用于您(GNU-sed):

或:


如果
shell
可能是
bash
etc

两者都可能重复,则首选循环中的一个,因为它消耗的时间较少。我没有新的
[:digit:][/code>东西。你能给我解释一下吗。
[[:digit:]
是POSIX属性,可以匹配glob或regex模式中的一个数字
[0-9]
。好的,唯一的问题是识别
\u S
,理想情况下,这对*.sorted.*中的f也应该有效;执行mv“$f”“${f/_S[[0-9]]*.sorted}”;完成
请注意,这是在Debian/Ubuntu及其衍生物中找到的perl脚本
重命名
,但不一定出现在其他基于Debian的Linux设备上,如Arch Linux、CentOS、Slackware等,我相信这些设备上使用了util Linux的重命名。tl;dr您不能依赖于重命名的行为。
for f in *.sorted.*; do
   mv "$f" "${f/_S[[:digit:]]*.sorted}"
done
sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/e' file
sed -r 's/^(.*)_[^_.]*\.[^.]*(.*)/mv "&" "\1\2"/' file | shell