首先我有
for file in `ls -t dir` ; do
#blah
done
但是带有空格的文件将分为两个迭代。
我发现了很多解决空间问题的方法,但是随后在$file
变量中保留了一些日期信息。
编辑:显示一种这样的变化:
for file in `find . -printf "%T@ %Tc %p\n" | sort -n` ; do
#blah
done
问题在于,所有时间信息仍然在$file
循环中的变量内。(同样,这不起作用,因为我碰巧是在OSX上,它的find
实用程序缺少该-printf
选项...)
使用find
与组合xargs
通过与NUL字节分离文件名,并使用while
效率和空间保存读取循环:
find /path/to/dir -type f -print0 | xargs -0 ls -t | while read file
do
ls "$file" # or whatever you want with $file, which may have spaces
# so always enclose it in double quotes
done
find
生成文件列表,ls
在这种情况下按时间排列它们。要颠倒排序顺序,请替换-t
为-tr
。如果要按大小排序,请替换-t
为-s
。
例:
$ touch -d '2015-06-17' 'foo foo'
$ touch -d '2016-02-12' 'bar bar'
$ touch -d '2016-05-01' 'baz baz'
$ ls -1
bar bar
baz baz
foo foo
$ find . -type f -print0 | xargs -0 ls -t | while read file
> do
> ls -l "$file"
> done
-rw-rw-r-- 1 bishop bishop 0 May 1 00:00 ./baz baz
-rw-rw-r-- 1 bishop bishop 0 Feb 12 00:00 ./bar bar
-rw-rw-r-- 1 bishop bishop 0 Jun 17 2015 ./foo foo
为了完整起见,我将重点说明从注释到问题的一个问题:-t
按修改时间排序,而不是严格按创建时间排序。这些文件所在的文件系统决定了创建时间是否可用。由于您最初的尝试是使用-t
,所以我认为修改时间就是您所关心的时间,即使这并不是很真实。
如果您需要创建时间,则必须从某个来源中提取它,例如,stat
或者在其中编码的文件名中。从根本上讲,这意味着用xargs -0 ls -t
管道输送到的合适命令来代替sort
,例如:xargs -0 stat -c '%W' | sort -n
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句