
Мне было интересно, возможно ли создать команду, которая создает один файл, но при каждом выполнении команды она не перезаписывает файл, созданный при предыдущем выполнении.
Например: 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
команду.