Сценарии Bash для создания затем самого высокого файла

Моя задача состоит в том, чтобы записать сценарий, который создает следующий самый высокий файл в конкретном каталоге. Мне удалось отсортировать файлы в каталоге, таким образом, сценарий производит самое высокое имя файла. Например, из файлов red_01 red_02 red_03 это производит red_04

Моя следующая задача состоит в том, чтобы создать самый высокий файл поэтому, как я могу заставить его создать red_04 файл? Я должен сохранить число в переменной и увеличить его так или иначе?

5
задан 27 June 2017 в 03:08

4 ответа

Это сделает то, в чем Вы нуждаетесь. Скорректируйте пути для любого пути, в котором Вы нуждаетесь, могли использовать переменные также и проанализировать их в сценарий. Но да Вы могли скорректировать его сами ;)

#!/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
2
ответ дан 23 November 2019 в 08:54

Не анализируя 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
)
3
ответ дан 23 November 2019 в 08:54

Цикл через нумерует и проверка, если файл уже существует. Если это существует, продолжайте цикл; если файл не существует, создайте его.

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 будут существовать.

2
ответ дан 23 November 2019 в 08:54

Это работает, даже если разрывы присутствуют и событие, если числа не дополнены в именах файлов

#!/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".

2
ответ дан 23 November 2019 в 08:54

Другие вопросы по тегам:

Похожие вопросы: