如何检查以数字命名的文件,如果存在,则使用下一个序列号以新名称复制它

如何检查以数字命名的文件,如果存在,则使用下一个序列号以新名称复制它

首先我要为我的知识匮乏表示歉意;这实际上是我的第一个 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"

相关内容