Как создать последовательно пронумерованные имена файлов в bash?

Мне нужен скрипт, который создаст файл со следующим файлом в последовательности. Каждое выполнение скрипта должно создавать только один файл, и скрипт может быть запущен ноль или более раз в любой день. Файлы должны быть названы после текущей даты в формате %y%m%d со вторым файлом с добавлением -01 , третий файл, который будет создан в заданную дату, будет иметь -02 и т. Д. Например:

 20170125.txt // first file create on the day. 20170125-01.txt // 2nd file 20170125-02.txt // 3rd file 

Пока у меня есть этот супер базовый сценарий, который создает мой первый ежедневный файл, но я не понимаю, как это сделать после инкрементной нумерации.

 #! /bin/bash DATE=`date +%Y%m%d` touch "$DATE.txt" 

 today="$( date +"%Y%m%d" )" number=0 while test -e "$today$suffix.txt"; do (( ++number )) suffix="$( printf -- '-%02d' "$number" )" done fname="$today$suffix.txt" printf 'Will use "%s" as filename\n' "$fname" touch "$fname" 

today получает сегодняшнюю дату, и мы инициализируем наш счетчик, number равно нулю. Затем мы проверяем, существует ли уже существующее имя файла ( $suffix будет пустым для начала). Если это так, увеличьте счетчик и создайте новый суффикс с помощью printf . Повторяйте, пока у нас больше не будет столкновения с именем файла.

Строка формата для printf , -%02d означает «буквальная тире, за которой следует нулевое двухзначное целое число». Двойная тире ( -- ) требуется перед строкой формата, чтобы остановить printf от интерпретации тире в строке формата в качестве опции.

touch просто для тестирования.

Это приведет к созданию имен файлов, таких как

 20170125.txt 20170125-01.txt 20170125-02.txt 20170125-03.txt 

и т. д. на последующих тиражах.

Вы можете использовать seq . Он может создавать числовые последовательности различными способами, однако вам нужно знать общее количество файлов.

Например: вы можете попробовать seq -w 1 10 . Он будет создавать последовательность от 01 до 10 , затем вы можете включить ее в цикл for:

 for i in `seq -w 1 10` do touch `date +%Y%m%d`-$i.txt done 

Добавление для вашего последнего обновления вопроса:

Чтобы выполнить то, что вы хотите легко, вы можете создать первый файл с -0 . В последующих прогонах вам нужно взять список файлов, sort их, взять последний, cut из последнего - и получить номер, увеличить его и создать новый файл с этим номером.

Однако заполнение потребует еще нескольких работ.

Что-то вроде…

 #!/bin/bash DATE=$(date +%Y%m%d) filename="${DATE}.txt" num=0 while [ -f $filename ]; do num=$(( $num + 1 )) filename="${DATE}-${num}.txt" done touch $filename 

…должно сработать. Это создает имена файлов формата DATE-1.txt, DATE-2.txt, DATE-3.txt, …, DATE-10.txt, DATE-11.txt и т. Д. Изменение этого параметра на DATE-01.txt и т. д. остается в качестве упражнения для читателя 🙂

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

Замечание: существует множество программ для управления несколькими версиями файла. Они называются «системами управления версиями» (VCS) или «Управление контролем источника» (SCM). Git и subversion довольно популярны. Я предлагаю вам проверить их, а не переопределять свои собственные 🙂