Найдите имя файла с наибольшим номером в каталоге, где имена начинаются с цифр

StackOverflow https://stackoverflow.com/questions/1587059

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть каталог с файлами, которые выглядят следующим образом:

001_something.php  002_something_else.php
004_xyz.php        005_do_good_to_others.php

В конечном счете я хочу создать новый пустой PHP-файл, имя которого начинается со следующего номера в серии.

LIST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | tr '\n' ' '`

Предыдущий код выдает мне строку, подобную этой:

LIST='001 002 004 005 '

Я хочу взять это 005, увеличить на единицу, а затем использовать это число для создания нового имени файла.Как мне это сделать в BASH?

Это было полезно?

Решение

$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever

Итак, это зависит от bash.Ниже приведен любая-posix-оболочка, включая-bash решение, хотя я полагаю, что возможно что-то более простое.

$ cat /tmp/z
f () {
    eval echo \${$#} | sed -e 's/^0*//'
}
LIST='001 002 004 005 '
newname=`printf %03d-whatever $(($(f $LIST) + 1))`
echo $newname
$ sh /tmp/z
006-whatever
$ 

Другие советы

Вам нужен весь СПИСОК?

Если нет

LAST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`

дам вам только часть 005 и

printf "%03d" `expr 1 + $LAST`

выведет следующее число в последовательности.

Используя только стандартные инструменты, ниже вы получите префикс для нового файла (006).:

ls [0-9]* | sed 's/_/ _/' | sort -rn | awk '{printf "%03d", $1 + 1; exit}'

Это кажется более простым.

ls [0-9]* | sort -rn | awk '{FS="_"; printf "%03d_new_file.php\n",$1+1;exit}'

Быстрый, без подоболочек и циклов (также обрабатывает имена файлов с пробелами)*:

list=([0-9]*)
last=${list[@]: -1}
nextnum=00$((10#${last%%[^0-9]*} + 1))
nextnum=${nextnum: -3}
touch ${nextnum}_a_new_file.php

Учитывая ваши файлы-примеры, результат будет следующим:

006_a_new_file.php
$ for file in *php; do last=${file%%_*} ; done
$ newfilename="test.php"
$ printf "%03d_%s" $((last+1)) $newfilename
006_test.php

я оставляю на ваше усмотрение создание нового файла

  1. touch "newfile_$(printf "%03d" $(echo $(ls 00?_*.php|sed 's/_.*//'|sort -rn|head -1)+1|bc))"
    

    2.

    num=$(ls 00?*.php|sed 'ы/.*//'|sort -rn|head -1) 
    touch $(printf "newfile_%03d" $((num+1)))

Я публикую этот ответ, чтобы предложить минимальное решение основного вопроса "Найти имя файла с наибольшим номером в каталоге, где имена начинаются с цифр".:

ls -1 "$MyDir" | sort -hr | head -n 1

Первый оператор выводит файлы в MyDir в виде одной строки с параметром -1.Это передается в функцию сортировки, которая выполняет сортировку в удобном числовом порядке с помощью -h и в обратном порядке (сначала наибольшее число) с помощью -r.Это передается в функцию head, которая просто выдает наибольшее количество результатов -n (1 в примере).Ответ учитывает человеческий числовой порядок сортировки, т. е.221 - это больше, чем 67.Это решение POSIX shell, обладающее высокой совместимостью.

Вот решение (вам нужен bc):

#!/bin/bash

LIST='001 002 008 005 004 002 '
a=0

for f in $LIST
do
    t=$(echo $f + 1|bc)
    if [ $t -ge $a ]
    then
        a=$t
    fi
done

printf "%03d\n" $a
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top