首先我要为我的知识匮乏表示歉意;这实际上是我的第一个 bash 脚本,而我的 Linux 知识基本上是不存在的。解释性答案将不胜感激;我想了解为什么而不仅仅是如何。
我正在尝试编写一个脚本来自动执行每天必须执行多次的繁琐过程。简而言之,这个脚本应该根据一定的要求准备一组文件。该脚本必须根据在特定目录中找到的内容(例如,如果为空则创建,如果其中有内容则复制),将模板文件移入并为其分配版本号,或者使用新版本号复制现有文件。
例如,该文件可能被命名为
YYYYMMDD_##_用户名_testfile.json
其中 ##(版本号)对于第一次创建应为 01,然后对于副本应为 02,对于之后的副本应为 03,依此类推。单个目录可以包含最多 10 个以上的这些文件,所有文件都具有不同的日期和顺序版本号,以及使用相同格式但以 testfile.json 以外的其他内容结尾的其他文件
我似乎找不到一种方法让脚本在目录“test”中查找以 testfile.json 结尾且版本号最高的文件,如果找到,则将版本号提取为变量/参数,我可以通过回到cp序列。
此时我什至不确定要使用什么命令;互联网提供了从 grep 到 awk 到列表和排序的一切...我的头在旋转!
任何帮助,将不胜感激。我已删除所有识别信息,如果您需要更多信息,请告诉我。
答案1
让我们将其分解为多个步骤。
我们将编写一个返回下一个数字的函数。我们的目标是简单,而不是最大效率
您需要给它一个目录名称
您需要给它testfile.json
文件名的一部分
我们需要找到该目录中以该结尾结尾的所有文件。
使用 $1、$2 等将参数传递到函数中。
getnum(){
ls "$1" | grep "$2\$"
}
使用 cut 只取出第二个字段,用作_
分隔符。 (请注意,如果我要这样做,我会使用 sed 而不是 grep 和 cut,其他人可能会使用 awk,但我们在这里是为了简单起见)。
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2
}
使用 sort 对它们进行数字排序
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}
使用 head 只获取第一个值
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
}
总结一下,这样我们就可以得到局部变量中的值
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}
如果没有值,则将旧值设置为 0。打印出比旧值多一位的 2 位数字。
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
if [ "$oldnum" = "" ]
then
oldnum=0
fi
printf "%02d\n" $(($oldnum+1))
}
请注意,我可以省略对未设置 oldnum 的测试,因为在这种情况下$((oldnum+1))
将扩展为。$((+1))
我还可以使用 $((${oldnum:-0}+1)) 等表达式,请参阅手册以获取更多信息。
然后你可以使用这样的函数
dir=somewhere/logs
ext=testfile.json
cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"