我需要一个脚本来创建一个文件以及序列中的下一个文件。该脚本的每次执行应该只创建一个文件,并且该脚本可以在任何给定的一天运行零次或多次。文件应以当前日期命名,格式%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
。它将创建从01
to 的序列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