如何重命名末尾不带时间戳的文件

如何重命名末尾不带时间戳的文件

我想将这堆文件重命名为

TEST_API_CICD_03Sep2019_09:12:19.json
TEST_API_CICD_03Sep2019_09:12:20.json

对此

TEST_API_CICD.json
TEST_API_CICD.json

文件名长度不是恒定的

答案1

prename我将使用与 Perl 5.1 一起安装的强大 Perl 正则表达式程序回答这个问题

在包含文件的目录中运行此命令:

prename -v 's/_\d\d[A-Za-z]+\d\d\d\d_\d\d:\d\d:\d\d((\.[^.]*)?)$/$1/g' *

你可能会改变* 在命令结束时到您要重命名的文件列表(如果您只想重命名其中某些文件)。

翻译

通过以下方式重命名当前目录中的所有文件:删除“下划线- 后接 2 位数字- 后接一个或多个英文字母- 后接 4 位数字- 后接下划线- 后接 2 位数字- 后接冒号- 后接 2 位数字- 后接冒号- 后接 2 位数字-" 它位于文件扩展名之前(如果没有扩展名,则位于文件名末尾)。

笔记

  • 如果您想首先查看如何重命名(而不实际重命名它们),您可以将-v参数更改为。-n
  • 您的示例如果位于同一目录中,将导致文件名冲突。(见下文)
  • 如果新重命名的文件名与其他现有文件或之前重命名的文件名冲突;prename将打印一条警告,并且有问题的文件将保持未重命名状态。 (后续其他不受此问题影响的文件仍将继续重命名)
  • 请注意,没有命令可以删除文件名末尾的通用“日期”;有太多的日期和分隔符格式需要考虑;在重命名时应用错误的日期格式也会导致混乱。我给出的命令仅适用于示例中看到的文件名日期分隔符、日期格式和日期扩展名分隔符。看翻译上面的具体细节。
  • 我在 Debian GNU/Linux 7.0“Wheezy”i386(使用 Perl 5.14.2)上测试了这个

PS 强制漫画:“Perl 来救援!” (又名 XKCD #208 ”常用表达”)


1在像我这样的某些系统上,它也是您调用 时运行的程序rename。不过,与 @Philippos 评论中提到的 util-linux 的不一样。运行man rename并向下滚动到底部,将判断它是来自 Perl 还是来自 util-linux。

答案2

ls我会使用/ findsed和的组合sh

ls |sed -E '/TEST_API_CICD/{s!^(.*TEST_API_CICD)_........._..:..:..(\.json)$!mv -i "&" "\1\2"!;p};d'

第一部分位于/s 之间,是选择要重命名的文件的模式。括号内的部分是要保留的部分,作为新文件名以\1\2\3....图案不是括号内是要删除的部分。.(点) 是任何字符(如?全局表达式中的字符)。.是零个或多个任何字符(例如在全局表达式中)。^并将$模式锚定在开头和结尾,以便所有字符都匹配。

检查结果(使用|more|less,甚至|grep ...查找异常情况),如果看起来不错,则使用 运行它|sh

相关内容