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

Нажмите на значок батареи на панели и выберите опцию батареи в меню.

В появившемся окне выделите батарею слева и убедитесь, что выбрана вкладка Details. Интересными деталями являются значения Energy when full и Energy (design).

Если батарея новая, два значения должны быть почти одинаковыми. Если максимальный заряд значительно меньше расчетной платы, то это означает, что ваша батарея стареет.

4
задан 27 June 2017 в 13:08

12 ответов

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

#!/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
ответ дан 22 May 2018 в 21:07
  • 1
    Хм? Это подсчитывает существующие файлы и создает red_XX в зависимости от количества файлов в этом каталоге. Это создаст red_04, если существует red_01-03. Однако, если вы хотите сказать, что мы должны считать только файлы red_XX, то просто настройте команду find, чтобы они соответствовали этим критериям. – Ziazis 27 June 2017 в 12:30
  • 2
    oh nvm. Я вижу свою ошибку. У меня был обычный файл и в моем тесте, я его подкорректирую. – Ziazis 27 June 2017 в 12:37
  • 3
    Отлично работает :) – Ria 27 June 2017 в 12:54
  • 4
    Я получаю сообщение об ошибке, если не укажу "red_*" в выражении find (как и ожидалось - найти глобы должны быть указаны), и я все еще получаю $var как номер последнего существующего файла, а не следующего ... – Zanna 27 June 2017 в 13:25
  • 5
    @Ria обратите внимание, что это найдет все файлы, чье имя начинается с red_ в этом и любых подкаталогах , и оно сломается, если у вас есть файл с именем red_foo, где текст после red_ не является числом. – terdon♦ 27 June 2017 в 16:57

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

#!/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
ответ дан 18 July 2018 в 11:02

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

#!/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
ответ дан 24 July 2018 в 19:42

Без синтаксического анализа ls или find вывода и без создания каких-либо дополнительных файлов, увеличивая только имя последнего файла (другие файлы могут иметь любые имена).

Для подсчета файлов в directory:

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
ответ дан 22 May 2018 в 21:07

Прокрутите числа и проверьте, существует ли файл. Если он существует, продолжайте цикл;

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
ответ дан 22 May 2018 в 21:07

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

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

2
ответ дан 22 May 2018 в 21:07
  • 1
    Ваш NUM=$(echo $f| cut -d _ -f2) не будет работать, если имя файла содержит новую строку (что является позором, так как остальная часть вашего скрипта является надежной). Просто используйте оболочку, чтобы удалить бит, который вы не хотите: num=$(printf '%d' "${f##*_}"). Это также устраняет необходимость во втором printf и использует имена переменных нижнего регистра, которые являются хорошей практикой в ​​сценариях оболочки, чтобы избежать столкновения с переменными окружающей среды. – terdon♦ 27 June 2017 в 17:01
  • 2
    @terdon Ваша команда работала в командной строке, но я не мог заставить ее работать внутри скрипта, поэтому я изменил IFS и фильтр и передал имена через регулярное выражение, чтобы избежать пробелов и букв ... Я думаю, это не очень кратким сейчас, но не используя параметры (для краткости), теперь он немного более устойчив. Thanx для обратной связи. – Tulains Córdova 27 June 2017 в 17:29

Прокрутите числа и проверьте, существует ли файл. Если он существует, продолжайте цикл;

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
ответ дан 18 July 2018 в 11:02

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

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

2
ответ дан 18 July 2018 в 11:02

Без синтаксического анализа ls или find вывода и без создания каких-либо дополнительных файлов, увеличивая только имя последнего файла (другие файлы могут иметь любые имена).

Для подсчета файлов в directory:

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
ответ дан 18 July 2018 в 11:02

Прокрутите числа и проверьте, существует ли файл. Если он существует, продолжайте цикл;

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
ответ дан 24 July 2018 в 19:42

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

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

2
ответ дан 24 July 2018 в 19:42
  • 1
    Ваш NUM=$(echo $f| cut -d _ -f2) не будет работать, если имя файла содержит новую строку (что является позором, так как остальная часть вашего скрипта является надежной). Просто используйте оболочку, чтобы удалить бит, который вы не хотите: num=$(printf '%d' "${f##*_}"). Это также устраняет необходимость во втором printf и использует имена переменных нижнего регистра, которые являются хорошей практикой в ​​сценариях оболочки, чтобы избежать столкновения с переменными окружающей среды. – terdon♦ 27 June 2017 в 17:01
  • 2
    @terdon Ваша команда работала в командной строке, но я не мог заставить ее работать внутри скрипта, поэтому я изменил IFS и фильтр и передал имена через регулярное выражение, чтобы избежать пробелов и букв ... Я думаю, это не очень кратким сейчас, но не используя параметры (для краткости), теперь он немного более устойчив. Thanx для обратной связи. – Tulains Córdova 27 June 2017 в 17:29

Без синтаксического анализа ls или find вывода и без создания каких-либо дополнительных файлов, увеличивая только имя последнего файла (другие файлы могут иметь любые имена).

Для подсчета файлов в directory:

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
ответ дан 24 July 2018 в 19:42

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

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