我有一个以空格分隔的文件列表,我想使用该touch
命令按顺序更新它们的时间戳。但是当我提供文件名作为参数时,时间戳会以不同的顺序更新。
touch 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt 10.txt 11.txt 12.txt
运行上面的命令并运行ls -t
(按修改时间排序)后,我得到以下信息:
1.txt 10.txt 11.txt 12.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
向命令提供参数是否不能保证执行顺序?如果没有,我如何按特定顺序更新这些文件的时间戳?
答案1
如果没有指定时间,touch
则将其所有参数的时间戳更改为触摸每个文件时的当前时间,这应该为每个文件生成不同的时间戳,但在许多情况下,这最终会对其所有参数应用相同的时间戳;您可以通过运行stat
所有触及的文件来验证这一点。它们按照命令行上指定的顺序进行处理。
为了获得您想要的结果,您需要touch
单独循环每个文件,并有一些延迟:
for file in {1..12}.txt; do touch $file; sleep 0.1; done
(或多或少的延迟取决于底层文件系统的时间戳分辨率)。
请注意,ls -t
列出的文件按时间戳降序排序;查看您需要使用的次数增加ls -rt
。
答案2
也许这有点麻烦,但如果是在脚本中,我会使用 for 循环。
前任:
for x in 1.txt 2.txt 3.txt 4.txt [as many as you want here]; do touch $x; done
这将导致它们始终按照给定的顺序创建。当然,您可以将名称更改为任何名称,而不遵循任何模式。如果您要创建具有相同名称或数字模式的文件(如示例中所示),我会这样做:
for x in $(seq 1 10); do touch $x.txt; done