用于创建多个文件的shell脚本,下次执行时从最后一个文件开始递增

qxgroojn  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(162)

我正在尝试创建一个shell脚本,该脚本将创建指定数量的多个文件(或一批文件)。当达到该数量时,脚本停止。当脚本重新执行时,文件将从最后创建的文件开始。因此,如果脚本在第一次运行时创建了文件1-10,那么在下一次脚本执行时将创建11-20,依此类推。

enter code here
#!/bin/bash
NAME=XXXX
valid=true
NUMBER=1
while [ $NUMBER -le 5 ];
do
   touch $NAME$NUMBER
   ((NUMBER++))
   echo $NUMBER + "batch created"
   if [ $NUMBER == 5 ];
   then
     break
   fi
   touch $NAME$NUMBER
   ((NUMBER+5))
   echo "batch complete"
done
wkyowqbh

wkyowqbh1#

根据我上面的评论和您的描述,您可以编写一个脚本,每次运行时创建10个编号的文件(默认情况下),从下一个可用的编号开始。如前所述,与其使用原始未填充的编号,不如使用零填充的编号进行一般排序和列出,例如001002,...
如果你只使用12,...那么当你到达10的每一次幂时,你会得到奇数排序。考虑前12个文件,编号为1...12,没有填充。一般的列表排序会产生:

file1
file11
file12
file2
file3
file4
...

其中1112排在2之前。在printf -v中添加前导零可以避免此问题。
考虑到这一点,并允许用户通过将前缀作为参数来更改前缀(文件名的第一部分),还可以通过将count作为第二个参数来更改要创建的新文件的数量,您可以执行以下操作:

#!/bin/bash

prefix="${1:-file_}"                ## beginning of filename
number=1                            ## start number to look for
ext="txt"                           ## file extension to add

newcount="${2:-10}"                 ## count of new files to create

printf -v num "%03d" "$number"      ## create 3-digit start number
fname="$prefix$num.$ext"            ## form first filename

while [ -e "$fname" ]; do           ## while filename exists
  number=$((number + 1))            ## increment number
  printf -v num "%03d" "$number"    ## form 3-digit number
  fname="$prefix$num.$ext"          ## form filename
done

while ((newcount--)); do            ## loop newcount times
  touch "$fname"                    ## create filename
  ((! newcount)) && break;          ## newcount 0, break (optional)
  number=$((number + 1))            ## increment number
  printf -v num "%03d" "$number"    ## form 3-digit number
  fname="$prefix$num.$ext"          ## form filename
done

运行不带参数的脚本将创建前10个文件file_001.txt-file_010.txt。第二次运行时,将创建另外10个文件file_011.txtfile_020.txt
要创建一个包含5个文件且前缀为list_的新组,请执行以下操作:

bash scriptname list_ 5

这将产生5个文件list_001.txtlist_005.txt。使用相同的选项再次运行将创建list_006.txtlist_010.txt
由于上述3位数的方案最多限于1000个文件(如果包含000),则不需要从写入的最后一个文件中获取编号(bash可以相当快地计数到1000)。但是,如果您使用7位数,对于1000万个文件,那么您可能希望使用ls -1 | tail -n 1解析最后一个数字(或者版本排序并选择最后一个文件)。

number=$(ls -1 "$prefix"* | tail -n 1 | grep -o '[1-9][0-9]*')

(**注:**即ls -(one)不是ls -(ell)
如果这是你要找的,请告诉我。

相关问题