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

Дубликат: https://superuser.com/questions/516417/how-to-restrict-ssh-port-forwarding-without-denying-it

Похоже, вы можете использовать следующее?

В конфигурационном файле сервера есть опция PermitOpen. Эта опция может быть использована для указания хостов и портов, для которых могут быть установлены переадресации. Эта опция может быть использована внутри блока Match, поэтому ее можно ограничить по пользователю, группе, имени хоста или IP-адресу.

Редактировать:

PermitOpen host:port

PermitOpen IPv4_addr:port

PermitOpen [IPv6_addr]:port

7
25.01.2017, 13:02
3 ответа
today="$( date +"%Y%m%d" )"
number=0

fname=$today.txt

while [ -e "$fname" ]; do
    printf -v fname -- '%s-%02d.txt' "$today" "$(( ++number ))"
done

printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"

сегодня получает сегодняшнюю дату, и мы инициализируем наш счетчик, число , равным нулю и создаем начальное имя файла в качестве даты с суффиксом .txt .

Затем мы проверяем, существует ли уже имя файла. Если это так, увеличьте счетчик и создайте новое имя файла, используя printf . Повторяйте до тех пор, пока не исчезнет конфликт имен файлов.

Строка формата для printf , % s-% 02d.txt означает «строку, за которой следует буквальное тире, за которым следует заполненное нулями двузначное целое число и строка .txt ". Строка и целое число передаются в качестве дополнительных аргументов printf .

Двойное тире ( - ) необходимо перед строкой формата, чтобы не дать printf интерпретировать тире в строке формата в качестве опции. . -v fname помещает вывод printf в переменную fname .

Сенсорный нужен только для тестирования.

Это сгенерирует такие имена файлов, как

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

и т. Д. при последующих запусках.

19
27.01.2020, 20:15

. Вы можете использовать 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 . При последующих запусках вам нужно взять список файлов, отсортировать их, взять последний, вырезать его из последнего - и получить номер, увеличить его и создайте новый файл с этим номером.

Однако для заполнения нужно немного поработать.

5
27.01.2020, 20:15

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

#!/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 etc оставлен в качестве упражнения для читателя :)

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

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

3
27.01.2020, 20:15

Теги

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