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

Gre*_*g B 12 scripting bash shell-script

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

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file
Run Code Online (Sandbox Code Playgroud)

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

#! /bin/bash

DATE=`date +%Y%m%d`
touch "$DATE.txt"
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 17

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

等后续运行。

  • 解释加分。 (4认同)

bay*_*irh 5

您可以使用seq. 它可以通过多种方式创建数字序列,但是您需要知道文件总数。

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

for i in `seq -w 1 10`
do
  touch `date +%Y%m%d`-$i.txt
done
Run Code Online (Sandbox Code Playgroud)

最新问题更新的附录:

要轻松完成您想要的操作,您可以使用-0. 在后续运行中,您需要获取文件列表,sort它们,获取最后一个,cut从最后一个-并获取数字,增加它并使用该数字创建新文件。

填充需要更多的工作。

  • Linux 中有更高级的工具,比如 `logrotate`。如果您需要,他们可以自动执行类似的操作。你的问题需要一些处理,所以用 bash 可能不是微不足道的。这就是为什么我问了真正的原因。 (3认同)