BASH: Найти наивысшее имя нумерованного файла в каталоге, где имена начинаются с цифр (ls, sed)
У меня есть каталог с файлами, которые выглядят так:
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?
Ответы
Ответ 1
$ LIST=($LIST)
$ newfile=`printf %03d-whatever $((10#${LIST[${#LIST}]}+1))`
$ echo $newfile
006-whatever
Итак, это bash -специфическое. Ниже представлено решение любой-posix-shell-including- 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
$
Ответ 2
Вам нужен весь СПИСОК?
Если не
LAST=`exec ls $MY_DIR | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`
предоставит вам только часть 005 и
printf "%03d" `expr 1 + $LAST`
напечатает следующее число в последовательности.
Ответ 3
Используя только стандартные инструменты, следующее даст вам префикс для нового файла (006):
ls [0-9]* | sed 's/_/ _/' | sort -rn | awk '{printf "%03d", $1 + 1; exit}'
Ответ 4
Это кажется более простым.
ls [0-9]* | sort -rn | awk '{FS="_"; printf "%03d_new_file.php\n",$1+1;exit}'
Ответ 5
Быстрое, без подоболочки и без петли (также обрабатывает имена файлов с пробелами) *:
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
Ответ 6
$ for file in *php; do last=${file%%_*} ; done
$ newfilename="test.php"
$ printf "%03d_%s" $((last+1)) $newfilename
006_test.php
Я оставлю его для создания нового файла
Ответ 7
Ответ 8
Вот решение (вам нужно 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