Bash 脚本创建下一个最高文件

Bash 脚本创建下一个最高文件

我的任务是编写一个脚本,在特定目录中创建下一个最高文件。我已设法对目录中的文件进行排序,以便脚本输出最高文件名。例如,从文件中red_01 red_02 red_03输出red_04

我的下一个任务是创建最高文件,那么如何让它创建文件呢red_04?我需要将数字存储在变量中并以某种方式增加它吗?

答案1

无需解析lsfind输出,也无需创建任何额外的文件,仅增加最后一个文件的名称(其他文件可以有任何名称)。

计算目录中的文件数量:

stat * --printf "%i\n" | wc -l

获取最后一个文件:

i=0; j=$(stat * --printf "%i\n" | wc -l); for k in *; do (( (j - ++i) < 1 )) && echo "$k"; done

(( (j - ++i) < 1 ))这会测试循环已运行的次数,并将其与目录中的文件数进行比较。它依赖于按for顺序循环遍历文件的事实。

要获取下一个文件的名称,请假设以下模式name_{01..99}

i=0
j=$(stat * --printf "%i\n" | wc -l)
for k in *; do 
  (( (j - ++i) < 1 )) && 
  echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))")
done

要创建文件:

touch $(i=0; j=$(stat * --printf "%i\n" | wc -l); for k in *; do (( (j - ++i) < 1 )) && echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))"); done)

或者

touch $(
  i=0
  j=$(stat * --printf "%i\n" | wc -l)
  for k in *; do 
    (( (j - ++i) < 1 )) &&
    echo "${k%%_*}"_$(printf %02d "$(( ${k##*_} + 1 ))")
  done
)

答案2

这将满足您的需要。调整路径以适应您需要的任何路径,也可以使用变量并将其解析到脚本中。但是您可以自己调整它 ;)

#!/bin/bash
#count your existing files
NUMBERATM=`find ./ -type f -name "red_*" | wc -l`
#add +1 to create the next higher file
NUMBERATM=$((NUMBERATM+1))

#check if it's below 10 since you need the 0 infront of it
if [ $NUMBERATM -lt "10" ]; then
   var=0$NUMBERATM
else
   var=$NUMBERATM
fi

#create your file
touch red_$var

答案3

循环遍历数字并检查文件是否已存在。如果存在,则继续循环;如果文件不存在,则创建它。

for n in $(seq -w 01 99); do
    [[ ! -f "red_${n}" ]] && { touch "red_${n}"; break; }
done

$(seq -w 001 999)如果需要,请更改为或更多数字。

red_02注意:如果缺失,即使red_01存在,也会创建red_03

答案4

即使存在间隙,甚至文件名中没有填充数字,这种方法也能奏效

#!/bin/bash

highest=-1
IFS="   
"
for f in red_*; do
    num=$(echo $f| cut -d _ -f2)
    if [[ ! "$f" =~ red_[0-9]{1,2} ]];then #prevents failing because of                                
                                      #spaces or letters
        num=0
    else
        num=$(printf %d "$((10#$num))"); #eliminate zero padding to prevent 
                                         #interpretation as octal
    fi

    if [[ $num -gt "$highest" ]];then
        highest=$num
    fi
done

newfile=red_$(printf %02d $(($highest+1)))
echo $newfile
touch $newfile

--

您可以在输出中接收前缀和所需的零填充量作为参数,从而消除文字“red_”和“02”。

相关内容