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

Сначала я хочу извиниться за недостаток знаний; это буквально мой первый скрипт bash, и мои знания в Linux в основном отсутствуют. Пояснительные ответы были бы высоко оценены; Я хотел бы узнать, почему не просто как.

Я пытаюсь написать сценарий для автоматизации утомительного процесса, который нужно делать несколько раз в день. Короче говоря, этот скрипт должен подготовить набор файлов на основе определенных требований. Сценарий должен либо переместить файл шаблона, либо присвоить ему номер версии, либо скопировать существующий файл с использованием нового номера версии на основе того, что находится внутри одного конкретного каталога (например, создать, если пусто, скопировать, если есть что-то там).

В качестве примера можно назвать файл

ГГГГММДД _ ## _ username_testfile.json

где номер ## (номер версии) должен быть 01 для первого создания, затем 02 для копии, 03 для копии после этого и т. д. В одном каталоге может содержаться более 10+ этих файлов, все с разными датами и последовательными номера версий, а также другие файлы с использованием того же формата, но заканчивающиеся чем-то иным, чем testfile.json

Кажется, я не могу найти способ взглянуть на скрипт в каталоге «test» для файла, заканчивающегося в файле testfile.json с наивысшим номером версии, и если он найден, извлеките номер версии в качестве переменной / параметра, который я могу пройти обратно в последовательность cp.

На этом этапе я даже не знаю, какую команду использовать; Интернет предлагает все: от grep до awk до листинга и сортировки … крутит головой!

Любая помощь будет оценена по достоинству. Я удалил всю идентифицирующую информацию, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

One Solution collect form web for “Как проверить файл с числовым именем и, если он существует, скопировать его с новым именем, используя следующий порядковый номер”

Давайте разложим его на несколько шагов.

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

Вам нужно указать имя каталога

Вам нужно предоставить ему testfile.json части имени файла

Нам нужно найти все файлы в этом каталоге, которые заканчиваются этим окончанием.

Параметры передаются в функцию с использованием $ 1, $ 2 и т. Д.

 getnum(){ ls "$1" | grep "$2\$" } 

Используйте cut, чтобы вытащить только второе поле, используя _ в качестве разделителя. (Заметьте, что если бы я шел, я бы использовал sed вместо grep и cut, другие могли бы использовать awk, но мы собираемся для простоты здесь).

 getnum() { ls "$1" | grep "$2\$" | cut -d_ -f 2 } 

Используйте сортировку для их сортировки в цифровом виде

 getnum() { ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n } 

Используйте голову, чтобы получить только первое значение

  getnum() { ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1 } 

Оберните это, чтобы мы получили значение в локальной переменной

 getnum() { local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1) } 

Если бы не было значений, установите старое значение равным 0. Распечатайте 2-значное число, которое является еще одним из старого.

  getnum() { local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1) if [ "$oldnum" = "" ] then oldnum=0 fi printf "%02d\n" $(($oldnum+1)) } 

Обратите внимание, что я мог бы пропустить тест для oldnum, который не будет установлен, поскольку $((oldnum+1)) будет расширяться до $((+1)) в этом случае. Я также могу использовать выражения типа $ (($ {oldnum: -0} +1)), обратитесь к руководствам за дополнительной информацией.

Затем вы можете использовать такую ​​функцию

  dir=somewhere/logs ext=testfile.json cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext" 
  • Как отсортировать файл на основе раздела поля
  • Сортировка текста по определенному местоположению на каждой строке
  • другой вопрос с сортировкой в ​​bash
  • Последний сортировать по Linux
  • Скрипт, который будет читать 5 чисел, а затем сортировать с самого высокого на самый низкий
  • Почему uniq игнорирует Unicode и строки с одной буквой?
  • Как найти только каталоги и отсортировать их по размеру
  • Сортировка файла на основе одного столбца с использованием Unix и Awk
  • Сортировка выровненных столбцов
  • Где исчезла моя строка `uniq` или` sort -u`, с некоторыми символами юникода
  • Сортировка всех строк по горизонтали по ссылке на столбцы в определенной строке
  • Interesting Posts

    Почему CUPS нужны драйверы, если клиенты уже имеют их?

    Mac OSX, как автоматически генерировать поле выбора локально установленных принтеров?

    Почему рекурсия не идет вверх с rm?

    найти последовательный COM-порт

    Как установить драйвер Nvidia на Debian 8 на MS6 ge60 gtx960m?

    GREP для процессов по каталогам и убить его

    Как я могу что-то хранить, что угодно, компилировать навсегда?

    Мне нужно извлечь IP-адрес и путь к файлу из отчета Nessus, используя текстовый обработчик

    apt-get продолжает пытаться установить пакет, который уже установлен

    Как я могу узнать, был ли запущен исполняемый скрипт bash с -x для отладки?

    Как определить, использую ли я WPAD, и как его отключить, если я есть?

    JACK не может играть пыл вместе с другими медиа

    Почему / bin символическая ссылка на / usr / bin?

    Какими процессами порты (в качестве конечных точек связи) относятся к пересылке портов SSH?

    Убейте только один процесс Java

    Linux и Unix - лучшая ОС в мире.