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

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

8
задан 18 October 2011 в 22:28

9 ответов

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

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

9
ответ дан 25 May 2018 в 19:32
  • 1
    Это то, что я искал, спасибо! :) – Nick Lemaire 2 August 2011 в 20:53
  • 2
    Не работает в скрипте (не ожидая между ними) - я попробовал 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) создают по два файла. – Volker Siegel 26 September 2014 в 06:57
  • 3
    Лучше использовать $(), так как позволяет вам вставлять выражения, но вы также можете использовать обратные ссылки: touch test`date +%Y%m%d-%H%M%S`. – Pablo Bianchi 13 March 2017 в 21:24

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

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.

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

5
ответ дан 25 May 2018 в 19:32

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

1
ответ дан 25 May 2018 в 19:32
  • 1
    mktemp генерирует случайное уникальное имя файла, используя шаблон. Вероятно, вы захватите вывод mktemp в переменной. Из linuxmanpages : TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE – bgvaughan 8 August 2011 в 05:08
  • 2
    Другим распространенным методом является использование текущего идентификатора процесса из переменной оболочки $$: TMPFILE='/tmp/tmp.$$'; touch $TMPFILE – bgvaughan 8 August 2011 в 05:15

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

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.

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

5
ответ дан 25 July 2018 в 21:31

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

1
ответ дан 31 July 2018 в 11:05

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

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.

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

5
ответ дан 2 August 2018 в 03:09

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

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.

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

5
ответ дан 6 August 2018 в 03:21

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

1
ответ дан 10 August 2018 в 09:25

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

1
ответ дан 13 August 2018 в 12:49
  • 1
    mktemp генерирует случайное уникальное имя файла, используя шаблон. Вероятно, вы захватите вывод mktemp в переменной. Из linuxmanpages : TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE – bgvaughan 8 August 2011 в 05:08
  • 2
    Другим распространенным методом является использование текущего идентификатора процесса из переменной оболочки $$: TMPFILE='/tmp/tmp.$$'; touch $TMPFILE – bgvaughan 8 August 2011 в 05:15

Другие вопросы по тегам:

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