唯一 Linux 文件名,可按时间排序
Unique Linux filename, sortable by time
以前我使用 uuidgen 创建唯一的文件名,然后我需要通过 bash 脚本由 date/time 迭代。从那以后,我发现仅仅通过 'ls -l' 遍历所述文件是不够的,因为显然我只能相信 OS 以秒为单位保持时间戳分辨率(通过 stat 查看文件时,nonoseconds 全部为零特定的文件系统和内核)
所以我也许可以使用 date +%s%N
之类的名称作为我的文件名。这将打印自 1970 年以来的秒数,然后是当前的纳秒数。
此时我可能过度设计了这一点,但这些文件是在高使用率企业系统上生成的,所以我真的不想简单地相信纳秒时间戳(诚然非常小)机会二文件在同一纳秒内生成,我们发生了冲突。
我相信 uuidgen 脚本有处理这种情况的逻辑,所以在这种情况下它仍然保证是唯一的(如果我错了请纠正我......我在某个地方读到过,但谷歌是现在让我失望)。
所以...我正在考虑
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
除-
外,您还可以根据需要为date/time选择其他分隔符,只要它们在Linux文件名的有效字符范围内即可。
您将需要 %N
精度(纳秒):
filename=$(date +%s.%N)_$(uuidgen -t); echo $filename
1424699882.086602550_fb575f02-bb63-11e4-ac75-8ca982a9f0aa
顺便说一句,如果您使用 %N
而不是使用多线程,它应该足够独特。
您可以将 TIAGO 所说的 %N 精度与 taskset
结合起来
您可以在这里找到一些信息:http://manpages.ubuntu.com/manpages/hardy/man1/taskset.1.html
然后 运行 你的脚本
taskset --cpu-list 1 my_script
从未测试过这个,但是,它应该 运行 你的脚本只在你的 CPU 的第一个核心上。我在想,如果你的脚本 运行s 在你的第一个 CPU 核心上,结合日期 %N(纳秒)+ uuidgen,你就不可能得到重复的文件名。
以前我使用 uuidgen 创建唯一的文件名,然后我需要通过 bash 脚本由 date/time 迭代。从那以后,我发现仅仅通过 'ls -l' 遍历所述文件是不够的,因为显然我只能相信 OS 以秒为单位保持时间戳分辨率(通过 stat 查看文件时,nonoseconds 全部为零特定的文件系统和内核)
所以我也许可以使用 date +%s%N
之类的名称作为我的文件名。这将打印自 1970 年以来的秒数,然后是当前的纳秒数。
此时我可能过度设计了这一点,但这些文件是在高使用率企业系统上生成的,所以我真的不想简单地相信纳秒时间戳(诚然非常小)机会二文件在同一纳秒内生成,我们发生了冲突。
我相信 uuidgen 脚本有处理这种情况的逻辑,所以在这种情况下它仍然保证是唯一的(如果我错了请纠正我......我在某个地方读到过,但谷歌是现在让我失望)。
所以...我正在考虑
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
除-
外,您还可以根据需要为date/time选择其他分隔符,只要它们在Linux文件名的有效字符范围内即可。
您将需要 %N
精度(纳秒):
filename=$(date +%s.%N)_$(uuidgen -t); echo $filename
1424699882.086602550_fb575f02-bb63-11e4-ac75-8ca982a9f0aa
顺便说一句,如果您使用 %N
而不是使用多线程,它应该足够独特。
您可以将 TIAGO 所说的 %N 精度与 taskset
结合起来
您可以在这里找到一些信息:http://manpages.ubuntu.com/manpages/hardy/man1/taskset.1.html
然后 运行 你的脚本
taskset --cpu-list 1 my_script
从未测试过这个,但是,它应该 运行 你的脚本只在你的 CPU 的第一个核心上。我在想,如果你的脚本 运行s 在你的第一个 CPU 核心上,结合日期 %N(纳秒)+ uuidgen,你就不可能得到重复的文件名。