如何按时间顺序相反的方式列出目录和子目录中的所有文件?

98

我希望做类似于ls -t的操作,但是需要包含子目录中的文件。但问题是我不想要像ls -R那样的输出格式,它的格式如下:

[test]$ ls -Rt
b       testdir test

./testdir:
a

我希望格式化后的内容与find命令在子目录中显示文件的方式相同。例如:
[test]$ find .
.
./b
./test
./testdir
./testdir/a

但是,find 命令似乎不能按照最后更新时间的时间顺序进行排序。

那么我该如何列出目录和子目录下所有文件,格式与 find 命令相同,但是以反向时间顺序排列呢?


8
这不是一个编程问题,请使用http://www.superuser.com和http://unix.stackexchange.com。 - Dan Grossman
4
我正在程序中使用这个命令的输出。这不就是编程吗? - dan
小写字母 r?ls -tr - austin
8个回答

156

ls -lR 用于显示当前目录下的所有文件、目录和子目录。 ls -lR | more 可以将所有文件分页显示。


4
抱歉,我不明白为什么这会列出主目录中的内容?“R”标志是用于递归列出子目录,但在ls手册页中没有提到主目录。据我所知,它是在任何地方列出子目录。 - Muhamed Huseinbašić
2
好的直接回答 :) - RPichioli

52

试试这个:

find . -type f -printf "%T@ %p\n" | sort -nr | cut -d\  -f2-

4
只是提供信息,这仅适用于GNU的find命令。至少,在FreeBSD上的find命令不支持printf命令。 - Ricky Morse
1
find . -type f -printf "%p\n" 不就足够了吗? - Telmo Trooper
@TelmoTrooper 如果你需要排序,那么就不能省略这些额外的字符。这些字符会影响按照最后修改时间进行排序。如果你不关心排序,那么你的版本已经足够了。 - detuur

25

如果您要查看的文件数量在最大参数限制内,则可以使用globbing获取所需内容,如果有globstar支持则可以递归获取。

对于恰好2层深度,请使用:ls -d * */*

对于递归,使用globstar,可使用:ls -d **/*

-d参数告诉ls不要递归传递作为参数的目录(因为您正在使用shell globbing来进行递归)。 这样可以防止ls使用其递归格式化。


@YoYo,感谢你删除了我底部多余的解释行。我试图提交一个仅更改了一个字符的编辑,但是SO拒绝了它,说这个更改太小了。你知道有没有其他的方法可以解决这个问题吗? - Taylor D. Edmiston

8

Try find . -type d or find . -type d -ls


5
你能否解释一下为什么这个答案能够回答这个问题。 - ChrisF

3
find -type f -print0 | xargs -0 ls -t

缺点:仅适用于一定数量的文件。如果您有大量文件,则需要更复杂的解决方案。


你忘了添加搜索域:find . -type f -print0 | xargs -0 ls -t,但是你的解决方案在Mac OS上运行,而其他列出的解决方案则不行。 - d00d

2
尝试这个:
ls -ltraR |egrep -v '\.$|\.\.|\.:|\.\/|total' |sed '/^$/d'

1

wfg5475的答案中的命令已经可以正常工作,只需要添加一件事情来显示目录及其子目录中的文件:

ls -ltraR |egrep -v '\.$|\.\.|\.:|\.\/|total|^d' |sed '/^$/d'

添加了一件事情:^d可以忽略所有目录的列表输出。


0
如果可以使用GUI,尝试使用nautilus .,然后从搜索栏中进行搜索。默认情况下,此搜索会列出目录和子目录中的所有文件。但是,不能按照时间顺序相反的方式进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接