在移动文件名之前对其进行修剪

时间:2019-03-23 18:52:33

标签: bash rename

我正在尝试使用rename来就地编辑或修剪文件名,而不使用loop。以下两个命令均执行,但文件名保持不变。在我的实际数据中,有几个文件名为file的文件名。谢谢:)。

文件

19-0000-LastName-FirstName_v1_Non-Filtered_2019-03-21_08:12:56.txt

重命名

rename "s/_v1_Non-Filtered_d+_\d+//" *.txt
rename 's/_.*?//' *.txt

所需的文件名

19-0000-LastName-FirstName.txt

1 个答案:

答案 0 :(得分:1)

问题是重命名文件,例如:

19-0000-LastName-FirstName_v1_Non-Filtered_2019-03-21_08:12:56.txt

收件人:

19-0000-LastName-FirstName.txt

根据评论,英语可以表示为:

  

删除_v1之后的所有内容(保留扩展名除外)

这可以通过搜索和替换来完成:

rename 's/_v1.*(\..*)/$1/' *.txt
  • 匹配:
    • 第一次出现_v1
    • 尽可能多地遵循(.*
    • 后跟一个句点(\.
    • 跟着什么(.*
  • 由于第一个.*,明确匹配的时间段必须是最后一个
  • 括号( ... )捕获部分匹配内容供以后使用(如$1
  • 将整个比赛替换为捕获组

注意:

  • 您提供的模式包括_d+_\d+部分,由于缺少\,该部分与“下划线”,“ d”,“ +”,“下划线”,“一个或多个数字”匹配。这永远无法与您的文件名匹配。也许您的意思是:_\d+
  • s/_.*?//寻找_,后跟任何事物(*?)的最短序列(.)。任何内容的最短序列是空字符串。因此,该命令等效于:s/_//