我正在努力解决我在这里提出的问题:Bash: Changeing date of a file name and Increment number at end
我正在尝试创建一个 shell/bash 脚本来递增文件名(无论其类型如何),以便2023-09-12 Name V.32.md
检查前 10 位数字是否等于今天的日期;如果不是,则更正日期。但无论日期如何,最后的版本号都会递增到下一个数字,例如
2023-09-12 Name V.32.md
变成2023-09-14 Name V.33.md
我已经弄清楚了日期更改,但版本号给我带来了麻烦,因为我希望每当我触发文件上的脚本时这些都会更改。
同样重要的是,我不希望它覆盖当前正在发生的文件。相反,它应该创建任何文件的副本并将数字增加到下一个可用数字,以便如果这些文件存在:
2023-09-12 Name V.32.md
2023-09-14 Name V.33.md
我将脚本指向第一个文件,它不会替换第二个文件,而是创建一个名为的新副本2023-09-14 Name V.34.md
#!/bin/bash
fileName="$1"
f10="${fileName:0:10}"
today=$(date +"%Y-%m-%d")
fileNameWithoutExt="${fileName%.*}" # 2023-09-12 Name V.32
fileNameExt="${fileName##*.}" # md
lastPartOfFileName="${fileNameWithoutExt##*[^0-9]}"
num=$((lastPartOfFileName + 1)) # 32
firstPartOfFileName="${fileNameWithoutExt%$num}" # 2023-09-12 Name V.
fileNameNew="${firstPartOfFileName}${num}.${fileNameExt}" # 2023-09-12 Name V. 33.md
if [[ -f "$fileName" ]]; then
if [[ $f10 = $today ]]; then
# num=$((num + 1))
cp "$fileName" "$fileNameNew"
elif [[ $f10 != $today ]]; then
cp "$fileName" "$today ${fileNameNew:11}"
fi
fi
该脚本如果运行2023-09-12 Name V.32.md
将创建2023-09-12 Name V.3233.md
,但我不知道如何删除该双重编号。此外,它仍在替换文件而不是创建新文件。
谢谢!
编辑
为了澄清起见,文件名的格式是[date] [specific name, e.g. Presentation] [Version number, e.g. V32].[extension, e.g. .md or .pdf]
您可以利用 bash 的正则表达式支持并执行如下操作:
如果我们有上面的脚本
renumber.sh
并且当前目录中有一个名为的文件2023-09-12 Name V.32.md
,我们会看到以下行为:除了 Bash 正则表达式之外,如果您使用前缀/后缀技巧,您可以用来
set -x
显示 bash 正在做什么。在您的情况下,如果您使用
set -x
(在 shebang 之后或在 shebang 中,例如:)运行脚本#!/bin/bash -x
,则会输出以下内容:该错误是由于您的 num 首先递增,因此
${fileNameWithoutExt%$num}
不会产生预期的结果。您必须先使用该值:
!=
另外,如果您已经测试过,则无需测试==
: