Командная строка: создать файл с новым именем, если имя файла уже существует

Командная строка: создать файл с новым именем, если имя файла уже существует

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

Например: touch test1.txtсоздаст 1 файл с именем test1.txt. Но в следующий раз, когда я его выполню, я бы хотел, чтобы новый файл назывался test2.txt, или что-то в этом роде. Так, чтобы не перезаписывать уже существующий файл. Таким образом, его можно было бы выполнить несколько раз без проблем.

Не поймите меня неправильно, я не пытаюсь создать несколько файлов с помощью одной команды.

Заранее спасибо!

решение1

Самым простым решением было бы добавить временную метку к имени файла и не использовать ни одной цифры.

Самый простой способ создать пустой файл — это touch test$(date +%Y%m%d-%H%M%S)и это приведет к созданию файла с именем test20110802-170410. Во второй раз test*будет получена более новая временная метка, поэтому это приведет к созданию 2 файлов.

решение2

Я сомневаюсь, что существует общая команда, позволяющая это сделать, но вы можете придумать что-то вроде этого:

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

Входной параметр функции разделяется на префикс, номер, суффикс, затем, пока файл существует, номер увеличивается. Найден свободный слот, файл создается с touch.

Механизм разделения должен быть адаптирован под ваши потребности, а также должны быть добавлены различные проверки ошибок.

решение3

Если порядковые номера не требуются, то проще всего использовать mktempкоманду.

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