如何在 bash 中创建按顺序编号的文件名?

如何在 bash 中创建按顺序编号的文件名?

我需要一个脚本来创建一个文件以及序列中的下一个文件。该脚本的每次执行应该只创建一个文件,并且该脚本可以在任何给定的一天运行零次或多次。文件应以当前日期命名,格式%y%m%d为附加第二个文件-01、在给定日期创建的第三个文件-02等。例如:

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file

到目前为止,我已经有了这个超级基本的脚本来创建我的第一个每日文件,但我对如何在之后进行增量编号感到困惑。

#! /bin/bash

DATE=`date +%Y%m%d`
touch "$DATE.txt"

答案1

today=$( date +%Y%m%d )   # or: printf -v today '%(%Y%m%d)T' -1
number=0

fname=$today.txt

while [ -e "$fname" ]; do
    printf -v fname '%s-%02d.txt' "$today" "$(( ++number ))"
done

printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"

today获取今天的日期,我们将计数器 初始化number为零,并创建初始文件名作为带后缀的日期.txt

然后我们测试文件名是否已经存在。如果是,则增加计数器并使用 . 创建一个新文件名printf。重复此操作,直到不再出现文件名冲突。

printf, ,的格式字符串%s-%02d.txt表示“一个字符串,后跟一个短划线,后跟一个零填充的两位整数和字符串.txt”。字符串和整数作为 的进一步参数给出printf

-v fname的输出printf放入变量 中fname

只是touch用于测试。

这将生成类似的文件名

20170125.txt
20170125-01.txt
20170125-02.txt
20170125-03.txt

等后续运行。

答案2

您可以使用seq。它可以通过多种方式创建编号规则,但是您需要知道文件的总数。

例如:你可以尝试一下seq -w 1 10。它将创建从01to 的序列10,然后您可以将其包含在 for 循环中:

for i in `seq -w 1 10`
do
  touch `date +%Y%m%d`-$i.txt
done

您最新问题更新的附录:

为了轻松完成您想要的任务,您可以使用 创建第一个文件-0。在后续运行中,您需要获取文件列表,然后从最后一个文件sort中提取最后一个文件并获取编号,将其递增,然后使用该编号创建新文件。cut-

不过,填充还需要一些工作。

答案3

就像是...

#!/bin/bash
DATE=$(date +%Y%m%d)
filename="${DATE}.txt"
num=0
while [ -f $filename ]; do
    num=$(( $num + 1 ))
    filename="${DATE}-${num}.txt"
done
touch $filename

...应该管用。这将创建 DATE-1.txt、DATE-2.txt、DATE-3.txt、...、DATE-10.txt、DATE-11.txt 等格式的文件名。将其更改为 DATE-01.txt等等留给读者作为练习:)

请注意,您可能还应该确保不会同时调用脚本多次,否则您将有多个脚本修改内容。

旁注:有很多软件可以管理文件的多个版本。它们被称为“版本控制系统”(VCS) 或“源代码控制管理”(SCM)。 Git 和 subversion 非常流行。我建议你检查一下它们,而不是重新实现你自己的:-)

答案4

如果环境变量中已有计数器值,则可以使用 Bash 算术来生成文件名 .... $(( ctr+=1 )) 递增 ctr 的值,并替换文件名字符串中的值。

$ ctr=0
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ ls
file-1-name.txt  file-2-name.txt file-3-name.txt  file-4-name.txt

相关内容