我的任务是编写一个脚本,在特定目录中创建下一个最高文件。我已设法对目录中的文件进行排序,以便脚本输出最高文件名。例如,从文件中red_01
red_02
red_03
输出red_04
我的下一个任务是创建最高文件,那么如何让它创建文件呢red_04
?我需要将数字存储在变量中并以某种方式增加它吗?
答案1
无需解析ls
或find
输出,也无需创建任何额外的文件,仅增加最后一个文件的名称(其他文件可以有任何名称)。
计算目录中的文件数量:
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”。