Bash脚本将文件重命名为文件名

时间:2016-06-23 04:48:44

标签: bash substring

我有一个从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

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

2 个答案:

答案 0 :(得分:1)

我使用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)

在您对其进行测试后,取消注释最后一行,并看到打印结果符合您的要求。

答案 1 :(得分: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