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

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

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

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

Например, файл может быть назван

ГГГГММДД_##_имя_пользователя_testfile.json

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

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

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

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

решение1

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

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

Вам нужно дать ему имя каталога.

Вам нужно указать testfile.jsonчасть имени файла

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

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

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

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

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

Используйте sort для их числовой сортировки.

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

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

 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. Выведите двузначное число, которое на единицу больше старого.

 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"

Связанный контент