如何限制递归文件列表的深度?


346

有没有办法限制Linux中递归文件列表的深度?

我目前使用的命令是:

ls -laR > dirlist.txt

但是我有大约200个目录,每个目录都有10个目录。因此,这将花费很长时间并且浪费太多的系统资源。

我真正感兴趣的是第一级子目录的所有权和权限信息:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/htdocs
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/cgi-bin

编辑:

最终选择命令:

find -maxdepth 2 -type d -ls >dirlist

3
你还可以ls -la /var/www/vhosts/*吗?
KevinO

Answers:


494

检出的-maxdepth标志find

find . -maxdepth 1 -type d -exec ls -ld "{}" \;

在这里,我使用1作为最大级别深度,-type d表示仅查找目录,然后ls -ld以长格式列出目录的内容。


2
由于OP希望了解目录本身的权限,因此应将-d选项添加到ls
彼得·范德·海登

@Peter van der Heijden:我只是写了find一部分来解决他的主要问题。无论如何,谢谢我添加它。
阿尔贝托·扎卡尼

3
我使用-print0xargs -0不少。示例:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
克里斯·K

2
哦,是的,肯定看起来错了,虽然不是6年前:D我已经在stackoverflow.com/a/25618630/57095上发表评论,它应该是公认的答案。
Alberto Zaccagni '16

啊,maxdepth,有深度选项吗?
亚历山大·米尔斯

95

利用 find的选项

实际上,不需要执行程序/bin/ls

查找具有一个可以执行此操作的选项:

find . -maxdepth 2 -type d -ls

要仅查看您感兴趣的子目录的一个级别,请添加-mindepth到与该级别相同的级别-maxdepth

find . -mindepth 2 -maxdepth 2 -type d -ls


使用输出格式

当显示的详细信息不同时,-printf可以以自定义格式显示有关文件的任何详细信息;为了显示符号权限和文件的所有者名称,使用-printf%M%uformat

后来我注意到您需要包含该组的完整所有权信息。使用%g的格式符号名称,或%G为组ID(如也%U为数字用户ID)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

这应该只为您提供所需的详细信息,以及正确的文件。

我将给出一个示例,该示例实际上显示用户和组的不同值:

$ sudo find /tmp -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
drwx------ www-data  www-data /tmp/user/33
drwx------ octopussy root     /tmp/user/126
drwx------ root      root     /tmp/user/0
drwx------ siegel    root     /tmp/user/1000
drwxrwxrwt root      root     /tmp/systemd-[...].service-HRUQmm/tmp

(为便于阅读而编辑:缩进,缩短了最后一行)


性能说明

尽管执行时间与这种命令无关紧要,但此处的性能提升足够大,值得一提:

我们不仅为每个名称创建了一个新的流程,这是一项艰巨的任务,而且find众所周知,甚至不需要读取该信息。


9
这应该是公认的答案,比我的要好得多。
Alberto Zaccagni '16

1
@AlbertoZaccagni我想我们喜欢简短的答案,以快速解决问题。
anddero '17

65

tree -L 2 -u -g -p -d

以漂亮的格式打印目录树,直到深度2(-L 2)。打印用户(-u)和组(-g)以及权限(-p)。仅打印目录(-d)。树还有很多其他有用的选择。


12
树就是爱。树就是生命。
yosefrow

在某些情况下简单tree -L 2 xxx/tree -L 2 -d xxx/足够。
Eric Wang

1

我真正感兴趣的只是第一级子目录的所有权和权限信息。

我在玩鱼时发现了一个简单的解决方案,非常适合您的需求。

ll `ls`

要么

ls -l $(ls)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.