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

8

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

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

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

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

Ник Лемэр
источник

Ответы:

9

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

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

Rinzwind
источник
Это как раз то, что я искал, спасибо! :)
Ник Лемэр
Не работает в сценарии (не ждет между) - я пытался touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S), он создал только один файл. Наносекундное время работает: touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)и touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)создайте два файла каждый.
Фолькер Сигел
Лучше всего использовать , $()так как позволяет гнездовых выражения, но вы также можете использовать кавычку: touch test`date +%Y%m%d-%H%M%S`.
Пабло Бьянки
5

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

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.

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

enzotib
источник
блестящий, отличная функция.
Марко Чеппи
1

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

Михал Шрайер
источник
mktemp генерирует случайное уникальное имя файла, используя шаблон. Вы, вероятно, захватите вывод mktemp в переменной. Из linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan
Другой распространенный метод - использовать текущий идентификатор процесса из переменной оболочки $$:TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan