Моя задача состоит в том, чтобы записать сценарий, который создает следующий самый высокий файл в конкретном каталоге. Мне удалось отсортировать файлы в каталоге, таким образом, сценарий производит самое высокое имя файла. Например, из файлов red_01
red_02
red_03
это производит red_04
Моя следующая задача состоит в том, чтобы создать самый высокий файл поэтому, как я могу заставить его создать red_04
файл? Я должен сохранить число в переменной и увеличить его так или иначе?
Это сделает то, в чем Вы нуждаетесь. Скорректируйте пути для любого пути, в котором Вы нуждаетесь, могли использовать переменные также и проанализировать их в сценарий. Но да Вы могли скорректировать его сами ;)
#!/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
Не анализируя 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
)
Цикл через нумерует и проверка, если файл уже существует. Если это существует, продолжайте цикл; если файл не существует, создайте его.
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
будут существовать.
Это работает, даже если разрывы присутствуют и событие, если числа не дополнены в именах файлов
#!/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
-
Вы могли бы получить и префикс и желаемый объем нулевого дополнения в выводе как параметры, устранив литералы, "красные _" и "02".