[英]Bash script for linux to create 5 new files
我需要帮助来创建一个bash脚本。 我希望每次运行脚本时都会创建5个新文件。
我尝试了一个像这样的基本for循环:
#!/bin/bash
for i in {0..5}
do
touch File${i}
done
显然,这只是创建了一个名为5个文件, File1
至File5
。 每次运行脚本时,我都需要它使用新名称制作5个新文件。 在寻找什么方向的任何提示?
无需使用循环。 只需这样做
touch File{1..5}
每次根据范围创建新文件
START=$(ls | wc -l)
END=$((START+1))
for((i=START;i<=END;i++)); do
touch File$i
这个答案是在明确名称是连续的并且继续上一次运行之前给出的。 我会让它站起来而不是删除它,因为它可能为其他未来的读者提供信息。
用mktemp
怎么样:
mktemp {a..e}XXXXXX
样本输出
aW1KLgp
bZrPq2I
c1BKn8i
dIjzxrc
ezpWkkO
这将为您提供一个以a
开头的文件,一个以b
开头,依此类推。
或者你可能更喜欢这个:
mktemp {1..5}-XXXXXX
1-00r8Gf
2-wjojeF
3-lPni6G
4-ihYrOP
5-B5YtEB
尝试类似的东西:
#!/bin/bash
count=$(ls File* 2>/dev/null | wc -l)
for ((i=$count+1; i<=$count+5; i++)); do
touch $(printf "File%03d" $i)
done
说明:
这里我假设文件以前缀“File”开头。
行count=$(ls ...)
计算目录中存在以“File”开头的文件数。 第2>/dev/null
部分2>/dev/null
用于在初始执行时没有这样的文件时抑制错误消息。 然后for
循环相应地生成另外五个文件。 您可以修改%03d
的数字,具体取决于您要生成的文件数量。
虽然其他一些建议使用ls
piped to wc
但这并不保证是正确的,请参阅此处。
相反,您可以获得当前目录中的文件数量:
files=( * )
num_files=${#files[@]}
if [[ $files=='*' ]]; then
touch File{000..004}
exit
fi
for (( i=num_files; i<num_files+5; i++)); do
touch $( printf "File%03d" $i )
done
快速分解每个部分的作用:
files=( * )
使用模式匹配来获取当前目录中的所有文件,即使它们包含换行符。 ( )
表示从这些文件生成数组并将其分配给files
。
${#files[@]}
将给出数组files
的元素数量,即目录中有多少文件。
if块检查files
是否为litterally *
,这意味着没有匹配的文件,也就是说你在一个空目录中,在这种情况下它会为你创建前5个文件。 否则,您将迭代接下来的5个文件编号。
touch $( printf "File$03d" $i )
在子shell中执行printf
,它将返回名称File后跟一个带有前导零的3位数字,以便您的文件按照您的预期排序。
你的问题也是一个人; {0..5}给你六个数字,而不是五个。
希望这可以帮助!
编辑0:
正如Mark在下面所说,使用shopt -s nullglob
将导致通配符在没有匹配任何文件时返回任何内容,这是此处所需的行为。
这是更新的解决方案:
shopt -s nullglob
files=( * )
num_files=${#files[@]}
for (( i=num_files; i<num_files+5; i++)); do
touch $( printf "File%03d" $i )
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.