微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

示例文件名:

iso1111_plane001_00321.moc1 iso1111_plane002_00321.moc1 iso2222_plane001_00123.moc1

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

例如:

在Bashpipe道中读取标准input块

如何在bash脚本中回显“$ x_ $ y”?

Git bash没有显示在我的窗口上的另一个useraccount

使用GNU并行在一个巨大的目录树上加速查找命令的最佳方法是什么?

在bash脚本中,在脚本退出后的提示符上打印命令(作为build议)

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选项,我没有太多的经验。

这个简单的bash命令有什么问题?

Unix脚本在每行末尾添加^ M

使用Bash脚本将input提供给命令行

可变比较错误

在命令不执行

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐