用于linux的Bash脚本创建5个新文件

时间:2018-03-27 09:25:27

标签: linux bash

我需要帮助来创建一个bash脚本。我希望每次运行时脚本都会创建5个新文件。

我尝试了一个基本的for循环:

#!/bin/bash

for i in {0..5}
do
  touch File${i}
done

显然,它只会创建5个名为File1File5的文件。每次运行脚本时,我都需要它使用新名称制作5个新文件。在寻找什么方向的任何提示?

4 个答案:

答案 0 :(得分:1)

无需使用循环。只需这样做

touch File{1..5}  

每次根据范围

创建新文件
START=$(ls | wc -l)
END=$((START+1))
for((i=START;i<=END;i++)); do  
    touch File$i

答案 1 :(得分:1)

这个答案是在明确名称是连续的并且继续上一次运行之前给出的。我会让它站起来而不是删除它,因为它可能为其他未来的读者提供信息。

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

答案 2 :(得分:1)

尝试类似:

#!/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

说明:

这里我假设文件以前缀&#34;文件&#34;。

开头

count=$(ls ...)计算以&#34;文件&#34;开头的文件数量。存在于目录中。当初始执行时没有这样的文件时,部分2>/dev/null用于抑制错误消息。 然后for循环相应地生成另外五个文件。您可以修改%03d中的数字,具体取决于您要生成的文件数量。

答案 3 :(得分:0)

虽然其他一些建议使用ls管道传递给wc,但这并不保证是正确的,请参阅here.

相反,您可以获取当前目录中的文件数量:

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是否为*,这意味着没有匹配的文件,也就是说你在一个空目录中,在这种情况下它将为你创建前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