【发布时间】:2017-05-30 07:59:53
【问题描述】:
我有大约 400 个纯文本文件,它们是我的写作作品,都以这样的方式命名,
A prose (June 30, 2013)
A sad story (Dec. 1, 2016)
文件名部分大多是中文或包含中文,但我想这无关紧要。 我想将它们重命名为
130630_A prose
161201_A sad story
通过使用 Bash 脚本。
这可能是我第一次编写 Bash 脚本。我对 c++ 相当熟悉,但我发现 Bash 很难学习。 虽然我对 Vim 的正则表达式有基本的了解,但我认为 Bash 的正则表达式是相似的。 我主要依靠this reference on wildcards。
我的尝试如图:
#! /usr/bin/env bash
EXT=.txt
for name_old in "*${EXT} */*${EXT} */*/*${EXT}"; do
str_title=$(expr "${name_old}" : '\(.*\)(.*).*')
str_date=$(expr "${name_old}" : '.*(\(.*\)).*')
str_y=$(expr "${str_date}" : '.*\([0-9]*\).*')
str_m=$(expr "${str_date}" : '.*\([a-zA-Z]*\).*')
str_d=$(expr "${str_date}" : '.*\([0-9]*,\).*')
if [ ${#str_y} -eq 0 ] || [ ${#str_m} -eq 0 ] || [ ${#str_d} -eq 0 ] ; then
continue
fi
name_new="${name_new}${str_y:2:3}"
convert_month "${str_m}" hold
name_new="${name_new}hold"
if [ ${#str_d} -eq 1 ]; then
name_new="${name_new}0${str_d:0:0}"
elif [ ${#str_d} -eq 2 ]; then
name_new="${name_new}${str_d:0:1}"
fi
name_new="${name_new}_${str_title}"
mv name_old name_new
done
function convert_month
{
if [ "$(expr "$(1)" : '.*\(Jan\).*')" -ne "" ]; then
$(2)=01
# ... omitted for brevity
elif [ "$(expr "$(1)" : '.*\(Dec\).*')" -ne "" ]; then
$(2)=12
fi
}
似乎什么都没有发生。一些语法只是我的猜测,所以我认为很多步骤都是错误的。 但是我在 Stack Overflow 上找不到这么复杂的例子,我也不清楚如何调试。
【问题讨论】:
-
第二个look输入行看起来很可疑,
A sad story (Dec. 1, 2016)Dec后面的.不应该在那里? -
是的,它就在那里。这是我的命名约定,或者是——我已经下定决心改变。是的,它很穷。故事是我很遗憾包含了这么多空格和句号,并为日期选择了如此冗长的命名方式。现在我想在 CLI 中编译它们,遇到了巨大的困难。
标签: regex bash shell parsing rename