bash脚本删除'x'字符数目在一个目录中多个文件名的结尾?

我有一个目录中的文件名列表( /path/to/local )。 我想从所有这些文件名中删除一定数量的字符。

示例文件名:

 iso1111_plane001_00321.moc1 iso1111_plane002_00321.moc1 iso2222_plane001_00123.moc1 

在每个文件名中,我希望删除文件扩展名之前的最后5个字符。

例如:

 iso1111_plane001_.moc1 iso1111_plane002_.moc1 iso2222_plane001_.moc1 

我相信这可以使用sed来完成,但我无法确定确切的编码。 就像是…

 for filename in /path/to/local/*.moc1; do mv $filname $(echo $filename | sed -e 's/.....^//'); done 

…但这不起作用。 对不起,如果我屠杀sed选项,我没有太多的经验。

Solutions Collecting From Web of "bash脚本删除'x'字符数目在一个目录中多个文件名的结尾?"

  mv $filname $(echo $filename | sed -e 's/.....\.moc1$//'); 

要么

  echo ${filename%%?????.moc1}.moc1 

%%是一个bash内部操作符…

这个sed命令将适用于你给出的所有例子。

 sed -e 's/\(.*\)_.*\.moc1/\1_.moc1/' 

但是,如果您只是想“在文件名的最后一个扩展名之前删除5个字符”,则此命令是您想要的:

 sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/' 

你可以像这样在脚本中实现:

 for filename in /path/to/local/*.moc1; do mv $filename "$(echo $filename | sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/')"; done 

第一个命令解释

第一个sed命令通过抓取所有字符来工作,直到第一个下划线: \(.*\)_

然后丢弃所有字符,直到找到.moc1.*\.moc1

然后它将它所找到的文本替换成括号中的所有内容: /\1

最后在.moc1添加.moc1扩展名并结束正则表达式: .moc1/

第二个命令解释

第二个sed命令首先抓取所有的字符: \(.*\)

然后强制停止抓取字符,这样可以丢弃5个字符,或者更具体地说,可以丢弃位于0-9,az和AZ范围内的五个字符: [0-9a-zA-Z]\{5\}

然后是“点'.' 字符来标记最后的扩展名: \.

然后它查找所有非点字符。 这确保我们抓住最后的扩展: \([^.]*\)

最后,它将用第一个和第二个捕获组替换所有的文本,并用. 字符,并结束正则表达式:/ /\1.\2/

这可能适用于你(GNU sed):

 sed -r 's/(.*).{5}\./\1./' file