独特的Linux文件名,可按时间排序

时间:2015-02-23 13:33:33

标签: bash timestamp uuid

以前我使用uuidgen来创建唯一的文件名,然后我需要通过bash脚本按日期/时间迭代。我已经发现简单地通过'ls -l'循环遍历所述文件是不够的,因为显然我只能信任操作系统以秒为单位保持时间戳分辨率(当通过特定文件系统和内核上的stat查看文件时,非秒数全为零)

所以我当时可能只是使用date +%s%N这样的文件名。这将打印自1970年以来的秒数,然后是当前纳秒。

此时我可能过度设计了这个,但是这些是在高使用率的企业系统上生成的文件,所以我真的不想简单地相信纳秒时间戳(无可否认很小)的机会两个文件是在同一纳秒内产生并发生碰撞。

我相信uuidgen脚本有逻辑来处理这种情况所以它仍然保证在这种情况下是独一无二的(如果我错在那里纠正我...我读到了某个地方我认为但谷歌让我失望了现在)。

所以......我正在考虑像

这样的东西
FILENAME=`date +%s`-`uuidgen -t`
echo $FILENAME

确保我创建一个唯一的文件名,然后可以使用简单的'ls'进行迭代,并且可以信任谁的名字是唯一的和按时间顺序的。

这方面有任何更好的想法或缺陷吗?

3 个答案:

答案 0 :(得分:6)

如果您按年,月(零填充),日(零填充),小时(零填充),分钟(零填充)订购日期格式,那么您可以轻松按时间排序:

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文件名的有效字符内。

答案 1 :(得分:2)

精度(纳秒)需要%N

filename=$(date +%s.%N)_$(uuidgen -t); echo $filename
1424699882.086602550_fb575f02-bb63-11e4-ac75-8ca982a9f0aa

顺便说一句,如果你使用%N并且你没有使用多个线程,它应该足够独特。

答案 2 :(得分:1)

您可以采用TIAGO关于%N精度的说法,并将其与taskset结合使用 您可以在此处找到一些信息:http://manpages.ubuntu.com/manpages/hardy/man1/taskset.1.html 然后运行您的脚本

taskset --cpu-list 1 my_script

从未对此进行测试,但是,它应该仅在CPU的第一个核心上运行脚本。我认为如果你的脚本在你的第一个CPU核心上运行,结合日期%N(纳秒)+ uuidgen那么你就无法获得重复的文件名。