【问题标题】:Bash script to rename file to just the date substring in the filename将文件重命名为文件名中的日期子字符串的 Bash 脚本
【发布时间】:2016-06-23 04:48:43
【问题描述】:

我有一个从 6 月初到今天的文件列表,其中包含任意名称和日期。

他们是:

JUNE 13.pdf

JUNE 16 MIDTERM REVIEW LAND GRABS 1 EXCLUSION AND BACKGROUND,.pdf

LECTURE JUNE 21 RUBBER RIGHTS RESISTANCE.pdf

SUMMER JUNE 15 TITLING AND LEGIBILITY.pdf

SUMMER JUNE 22 LIVELIHOODS.pdf

summer JUN 14 PROPERTY RIGHTS LECTURE.pdf

我今天已经尝试了很长一段时间来掌握 bash,但在我看过的所有解决方案中,我都无法理解非常复杂的语法。我知道您可以从文件中提取日期并相应地命名,但我真的很想学习如何使用 bash 提取子字符串。

我想出的最佳解决方案来自here

for j in *.pdf;
do
  length=`expr match "$j" 'JUN[E, ] ??'`
  ind=`expr index "$j" 'JUN' `
  mv $j ${j:ind:length}
done

但是这个解决方案只是给了我很多语法错误,没有任何迹象表明我做错了什么。我也尝试过使用剪切、重命名和其他一些“标准”的东西,但我真的很挣扎。

【问题讨论】:

  • 您愿意使用 Python 或其他更强大的语言吗?
  • 如果它是一个可执行的 shell 命令,那么我猜是的。
  • expr match 是锚定匹配:它只会匹配字符串的开头。

标签: bash substring


【解决方案1】:

expr 很有用,但可能不是最简单的方法。 (match 命令只会在字符串的开头匹配。)我假设您正在获取匹配目录的日期:如果这是不正确的假设,请根据需要更改测试。试试 sed:

for i in *.pdf; do 
  d=$(echo "$i" | sed -E 's/.*(JUNE? [0-9]+).*/\1/'); 
  test -d "$d" && mv -i "$i" "$d" 
done

【讨论】:

  • 这是我一直在寻找的答案。唯一的问题是它不会自动将 JUN 重命名为 JUN。
  • 此外,它从我没有注意到的文件中删除了 .pdf,但我将它们附加回来。
  • 要将 JUN 替换为 JUNE,您可以使用 sed -E 's/.*JUNE? *([0-9]+).*/JUNE \1/'
【解决方案2】:

我会使用 Python:

#!/usr/bin/env python

import os
import re
import sys

regex = re.compile('.*(JAN|FEB|MAR|APR|MAY|JUNE?|JULY?|AUG|SEP|OCT|NOV|DEC) (\d+).*(\.\w+)$')

for filename in sys.argv[1:]:
    matches = regex.match(filename)
    if matches:
        newname = ''.join(matches.groups())
        print "rename -", filename, "- to -", newname
        #os.rename(filename, newname)

在您测试最后一行并看到打印的结果是您想要的结果后取消注释。

【讨论】:

  • 这是一个很好的答案,它为我指明了一个我不知道的更强大的工具箱,但我明天必须阅读其中的一些语法才能理解它。
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2015-06-21
  • 2014-07-17
  • 2011-12-27
  • 1970-01-01
相关资源
最近更新 更多