我需要帮助来创建一个bash脚本。我希望每次运行时脚本都会创建5个新文件。
我尝试了一个基本的for循环:
#!/bin/bash
for i in {0..5}
do
touch File${i}
done
显然,它只会创建5个名为File1
到File5
的文件。每次运行脚本时,我都需要它使用新名称制作5个新文件。在寻找什么方向的任何提示?
答案 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