Уникальное имя файла Linux, отсортированное по времени
Раньше я использовал uuidgen для создания уникальных имена файлов, которые мне затем нужно перебрать по дате / времени с помощью сценария bash. С тех пор я обнаружил, что простого цикла по указанным файлам с помощью ‘ls -l’ будет недостаточно, потому что, очевидно, я могу доверять ОС только сохранять разрешение временной метки в секундах (несекунды равны нулю при просмотре файлов через stat в этой конкретной файловой системе и ядре )
Тогда я подумал, что, может быть, я мог бы просто использовать что-то вроде date +%s%N для моего имени файла. Это напечатает секунды с 1970 года, за которыми следуют текущие наносекунды.
Я, возможно, переусердствовал с этим на данном этапе, но это файлы, созданные в часто используемых корпоративных системах, поэтому я действительно не хочу просто доверять наносекундной временной метке на (по общему признанию, очень небольшой) шанс, что два файла будут созданы в та же наносекунда, и мы получаем столкновение.
Я считаю, что сценарий uuidgen имеет логику для обработки этого случая, поэтому он по-прежнему гарантированно будет уникальным в этом случае (поправьте меня, если я ошибаюсь . Я читал это где-то, как я думаю, но гуглы меня подводят прямо сейчас) .
Итак . я рассматриваю что-то вроде
FILENAME=`date +%s`-`uuidgen -t` echo $FILENAME
Чтобы убедиться, что я создаю уникальное имя файла, которое затем можно перебирать с помощью простого ‘ls’, и чье имя можно доверять как уникальному, так и последовательному по времени.
Есть ли лучшие идеи или недостатки в этом направлении?
Уникальное имя файла Linux, отсортированное по времени
Раньше я использовал uuidgen для создания уникальных имен файлов, которые затем мне нужно перебирать по дате/времени с помощью сценария bash. С тех пор я обнаружил, что простого цикла по указанным файлам с помощью “ls -l” будет недостаточно, потому что, видимо, я могу доверять ОС только для того, чтобы сохранить временную разрешающую способность за считанные секунды (nonoseconds все равны нулю при просмотре файлов через stat в этой конкретной файловой системе и ядро)
Поэтому я тогда, возможно, мог бы использовать что-то вроде date +%s%N для моего имени файла. Это будет печатать секунды с 1970 года, за которыми следуют текущие наносекунды.
На данный момент я могу переоценить это, но это файлы, созданные на высокопроизводительных корпоративных системах, поэтому я не хочу просто доверять наносекундной метке времени (по общему признанию, очень маленькой) случайности. Два файла генерируются в то же самое наносекунда, и мы получаем столкновение.
Я считаю, что сценарий uuidgen имеет логику, испеченную для обработки этого события, поэтому он по-прежнему гарантированно будет уникальным в этом случае (исправьте меня, если я ошибаюсь там… Я читал, что где-то я думаю, но googles терпят меня неудачей прямо сейчас),
Итак… Я рассматриваю что-то вроде
FILENAME='date +%s'-'uuidgen -t' echo $FILENAME
чтобы я создал уникальное имя файла, которое затем можно повторить с помощью простого “ls”, и кому можно доверять как уникальное, так и последовательное по времени.
Какие-нибудь лучшие идеи или недостатки в этом направлении?
Если вы заказываете свой формат даты по годам, месяцам (с нулевым запасом), днем (с нулевым запасом), часом (с нулевым запасом), минутой (с нулевой добавкой), вы можете легко сортировать по времени:
FILENAME='date '+%Y-%m-%d-%H-%M''-'uuidgen -t' echo $FILENAME
FILENAME='date '+%Y-%m-%d-%H-%M''-'uuidgen -t | head -c 5' echo $FILENAME
2015-02-23-08-37-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
2015-02-23-08-37-xxxxx # the same as above, but shorter unique string
Вы можете выбрать другие разделители для даты/времени, кроме — как вы хотите, до тех пор, пока они в пределах допустимых символов для имени файла Linux.
Вам понадобится %N для точности (наносекунды):
filename=$(date +%s.%N)_$(uuidgen -t); echo $filename 1424699882.086602550_fb575f02-bb63-11e4-ac75-8ca982a9f0aa
BTW, если вы используете %N и вы не используете несколько потоков, он должен быть достаточно уникальным.
Вы могли бы взять то, что TIAGO сообщило о точности% N, и объединить его с taskset Вы можете найти информацию здесь: http://manpages.ubuntu.com/manpages/hardy/man1/taskset.1.html, а затем запустить свой скрипт
taskset --cpu-list 1 my_script
Никогда не тестировал это, но он должен запускать ваш скрипт только на первом ядре вашего процессора. Я думаю, что если ваш скрипт работает на вашем первом ядре процессора, в сочетании с датой% N (наносекунды) + uuidgen, вы не сможете получить дубликаты имен файлов.
Генерируем уникальное имя файлу
Очень часто скрипты создают какие-то файлы, с которыми потом иногда приходится работать. Нам нужно получить условия, при которых каждый созданный файл был бы уникально назван, в не зависимости от сторонних факторов.
Первое что приходит на ум — система префиксов и суффиксов. Название файла условно разбивается на несколько составных логических частей, комбинируя которые получается финальное имя.
Например:
название_дата_время file1_17.11.2015_16.51
Приведенный пример является одним из самых популярных и логичных, в данной ситуации.
Но, допустим, что нам нужно получать по несколько файлов каждую минуту, или даже секунду.
В этом случае так же можно было бы дополнить существующую систему, но в данной статье хотелось бы разобрать немного другой метод. Он тоже иногда бывает довольно полезным.
Для генерации суффикса имени файла мы используем программу mcookie , которая генерирует случайную строку.
#!/bin/bash prefix_name="file_" suffix_name='mcookie' full_filename=$prefix_name.$suffix_name echo "Имя файла = \"$full_filename\"" exit 0
Запускаем наш скрипт и делаем его исполняемым. При желании сюда же в название можно добавить дату и время создания файла. Такие конструкции часто используются для создания Бекапов.
Создание уникального файла
Т.е. — набрали случайную последовательность символов, что делать потом?
Проверять наличие нельзя — пока проверяешь, другой процесс может создать файл.
Нужна команда типа touch, но возвращающая ошибку если файл уже есть.
Например, ln выдаёт единицу, если заданное имя новой ссылки на файл существует.
Создание временного уникального файла
Помогите пожалуйста, нужно создать временный файл с уникальным именем, я знаю что это делается с.
Создание уникального реквизита
Изучение 1С только начинаю, поэтому ссори за, может быть глупый вопрос. Как создать уникальный.
Создание и занесение в БД уникального идентификатора
надо сохранять в базу данных из заполненной формы скрытый ид. надо чтобы каждый раз ид увеличивался.
Создание уникального id для системы комментариев
Добрый день, я новичок и так получилось, что мне в наследие достался самописный сайт (раньше был.
Несколько замечаний:
1. Определитесь с длиной имени. Сколько символов должно содержать имя файла.
2. Можно задавать не случайный набор символов, а определённое имя и с помощью переменной присваивать имени порядковый номер в конце.
3. Можно в данном каталоге создавать пустой каталог и уже в нём создавать собственно целевой файл. А уже после переносить его с изменением имени на 1 уровень вверх и удалять временный подкаталог.
4. Использовать для создания файла оператор «>>», а не команду «touch», которая, по-идее, предназначена для несколько другого — изменения даты/времени последнего доступа к файлу, например.
5. Какие такие «другие процессы» вы имеете ввиду?
Сообщение от skvor
Сообщение от NeoMatrix
-практически все системы многозадачные и многопоточные. При построении сервера всегда есть вероятность одновременной работы нескольких программ с одним экземпляром данных. Для исключения повреждения данных и нужно решить задачу надёжного создания объекта с уникальным именем — PID нельзя, т.к. скрипты могут быть в одном пространстве скрипт-машины, а RANDOM теоретически не надёжен.
И это не подходит для задачи, когда имя д.б. уникальным, но не случайным — например счётчик ч.-либо, последовательная выдача ID и т.п.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#!/bin/bash exec 2> /dev/null NumberFileName=$(ls -1rvd `dirname $0`/$1.* | head -n 1) echo $NumberFileName BaseFileName=$ echo $BaseFileName StopFileName=$ stop echo $StopFileName Number=$ } echo $Number if [ -z "$ " ] ; then exit 1 ; fi ln "$ " "$ " if [ $? -ne 0 ] ; then exit 2 ; fi let NextNumber=Number+1 mv "$ $ " "$ $ " error=$? rm "$ " let error+=$? if [ $error -eq 0 ] ; then echo $ ; fi exit $error