在shell脚本中生成文件

在shell脚本中生成文件

如何生成 100 个格式为Test1YYYYMMDDHHMM1.txt, Test1YYYYMMDDHHMM2.txt, Test1YYYYMMDDHHMM3.txt, ...,的文件Test1YYYYMMDDHHMM100.txt?该文件被写入 shell 脚本中可变的目录中。

答案1

要可移植地创建所需的文件,并假设应该YYYYMMDDHHMM是当前的年、月、日、小时和分钟,您可以在 shell 中使用循环:

#!/bin/sh

destdir=${1:-.}

cd "$destdir" || exit 1

now=$( date +%Y%m%d%H%M )

i=0
while [ "$i" -lt 100 ]; do
    i=$(( i + 1 ))
    touch "Test1$now$i.txt"
done

会将cd "$destdir" || exit 1当前目录更改为任何目录路径$destdir引用的目录,或者终止脚本(如果不可能)。该destdir变量从脚本命令行上的第一个参数获取其值,或者,如果未给出参数,则将为.,即当前目录。要在其中创建文件,~/somedir您可以将此脚本作为./script ~/somedir.

首先将 的值设置now为您需要的时间戳的字符串表示形式。然后它循环 100 次并使用该touch命令以及时间戳和计数器变量创建文件i


bashshell 中,您可能希望使用大括号扩展来替换上面的循环。只要生成命令行的总长度不太长,这是可行的。如果它变得太长(对于 100 个文件来说就不会出现这种情况),您将收到“参数列表太长”错误,并且您将不得不诉诸类似于上面的循环的方法。

您还可以将特殊格式字符串与中%(...)T的内置实用程序一起使用,而不是调用该实用程序。这需要4.2 或更高版本。printfbashdatebash

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

touch "Test1$now"{1..100}.txt

如果您需要创建数千文件,上面的代码不允许你这样做,如果你真的不喜欢循环(或者就像编写不可读且无法维护的代码),那么该xargs命令可能会对您有所帮助:

#!/bin/bash

destdir=${1:-.}

cd "$destdir" || exit 1

printf -v now '%(%Y%m%d%H%M)T' -1

printf 'Test1%s.txt\n' "$now"{1..100} | xargs touch

这将调用touch实用程序 via xargs,该实用程序将从中读取参数printf并以可管理的批次(而不是一次全部)创建文件。由于是内置实用程序,printf因此使用所有文件名调用该实用程序不会有任何问题。printf


zshshell 中,如果你想与众不同,你可能会做类似的事情

#!/bin/zsh

destdir=${1:-.}

cd $destdir || exit 1

zmodload zsh/datetime

strftime -s now %Y%m%d%H%M

i=0
repeat 100 touch Test1$now$((++i)).txt

显然,您也可以使用普通的大括号扩展zsh,但上面显示了如何使用zshsrepeat循环的简化变体。

答案2

mkdir Test1$(date +%Y%m%d%H%M){1..100}
touch Test1$(date +%Y%m%d%H%M){1..100}.txt

这将创建 100 个目录,请参阅手册页了解日期,并检查 bash 中的大括号扩展。这些是你在这里工作的东西。

touch命令将执行相同的操作,但会创建文件。

这些想法可以在 bash 中的各种命令中使用,并以各种方式发挥作用,您应该真正花时间学习和理解

相关内容