删除最后一个下划线后的字符串后使用 sed 命令重命名多个文件

删除最后一个下划线后的字符串后使用 sed 命令重命名多个文件

我的目录中有一组文件,如下所示,我想在最后一个下划线出现后删除该字符串。每次的字符串可能不同。如果能用它来做就好了sed

输入文件:

com_101_00000_0001_a234.txt
com_101_retail_00000_0002_g345.ctl
com_101_lines_003_0002_1134.txt

结果文件名:

com_101_00000_0001.txt
com_101_retail_00000_0002.ctl
com_101_lines_00003_0002.txt

答案1

如果您的系统有 perl rename,您可以执行以下操作:

rename -n 's/_[^_]+?\././' *

如果您的文件最终可能具有相同的名称,为避免覆盖它们,请使用-i

rename -in 's/_[^_]+?\././' *

如果这符合您的预期,请删除-n来实际重命名文件。

如果你真的坚持硬塞sed进去,你可以做一些不必要的复杂的事情,如下所示:

for f in *_*.*; do
    new=$(printf "%s\n" "$f" | sed 's/\(.*\)_[^_]*\(\.[^_]*\)$/\1\2/')
    echo mv "$f" "$new"
done

或者,如果没有sed,则更理智:

for f in *_*.*; do echo mv "$f" "${f%_*}.${f##*.}" ; done

对于最后两个示例,如果它们符合您的预期,请删除echo来实际重命名文件。

相关内容