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

Jon*_*Jon 319 linux bash

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

我目前使用的命令是:

ls -laR > dirlist.txt
Run Code Online (Sandbox Code Playgroud)

但是我有大约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
Run Code Online (Sandbox Code Playgroud)

编辑:

最终选择命令:

find -maxdepth 2 -type d -ls >dirlist
Run Code Online (Sandbox Code Playgroud)

Alb*_*gni 465

结帐的-maxdepth标志find

find . -maxdepth 1 -type d -exec ls -ld "{}" \;
Run Code Online (Sandbox Code Playgroud)

这里我使用1作为最大级别深度,-type d意味着只查找目录,然后ls -ld以长格式列出内容.

  • 由于OP想知道目录本身的权限,你应该将`-d`选项添加到`ls`. (2认同)
  • 我经常使用`-print0`和`xargs -0`。例如:`find。-maxdepth 1-类型d -print0 | xargs -0 ls -d` (2认同)
  • 哦,是的,肯定它看起来不对,知道它,虽然6年前没有:D我已经在http://stackoverflow.com/a/25618630/57095评论它应该是公认的答案. (2认同)

Vol*_*gel 87

利用find选项

实际上并不/bin/ls需要高管;

Find有一个选项可以做到这一点:

find . -maxdepth 2 -type d -ls
Run Code Online (Sandbox Code Playgroud)

要仅查看您感兴趣的一个级别的子目录,请添加-mindepth到以下级别-maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls
Run Code Online (Sandbox Code Playgroud)


使用输出格式

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

我后来注意到你需要完整的所有权信息,其中包括该组.使用%g符号名称或%G组ID 的格式(也%U适用于数字用户ID)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
Run Code Online (Sandbox Code Playgroud)

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

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

$ 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
Run Code Online (Sandbox Code Playgroud)

(编辑为可读性:缩进,缩短最后一行)


关于表现的说明

虽然执行时间与这种命令大多无关,但是性能的提升足够大,值得指出:

我们不仅为每个名称保存创建新流程 - 这是一项艰巨的任务 - 甚至不需要读取信息,正如find已经知道的那样.

  • 这应该是公认的答案,比我的好得多. (8认同)

Sam*_*eer 63

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

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

  • 树就是爱.树是生命. (11认同)

rec*_*lic 8

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

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

ll `ls`
Run Code Online (Sandbox Code Playgroud)

或者

ls -l $(ls)
Run Code Online (Sandbox Code Playgroud)