我想将这堆文件重命名为
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
我会使用/ find
、sed
和的组合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
。