【问题标题】:How to limit depth for recursive file list?如何限制递归文件列表的深度?
【发布时间】:2011-05-29 10:04:50
【问题描述】:

有没有办法限制 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

【问题讨论】:

  • 你也可以像ls -la /var/www/vhosts/*一样吗?

标签: linux bash


【解决方案1】:

查看find-maxdepth 标志

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

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

【讨论】:

  • 既然 OP 想知道目录本身的权限,你应该在ls 中添加-d 选项。
  • @Peter van der Heijden:我刚刚写了find 部分来解决他的主要问题。无论如何,谢谢我添加它。
  • 我经常使用-print0xargs -0。示例:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
  • 哦,是的,它看起来肯定是错误的,但 6 年前并没有:D 我已经在 stackoverflow.com/a/25618630/57095 上评论说它应该是公认的答案。
  • 啊啊最大深度,有深度选项吗?
【解决方案2】:

利用find的选项

实际上不需要/bin/ls 的执行者;

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

find . -maxdepth 2 -type d -ls

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

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

使用输出格式

当显示的详细信息应该不同时,-printf 可以以自定义格式显示有关文件的任何详细信息; 要显示文件的符号权限和所有者名称,请在format 中使用-printf%M%u

我后来注意到您需要完整的所有权信息,其中包括 群组。使用 %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 已经知道了。

【讨论】:

  • 这应该是公认的答案,比我的好多了。
  • @AlbertoZaccagni 我想我们喜欢简短的回答来快速让事情顺利进行。
【解决方案3】:

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

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

【讨论】:

  • 树就是爱。树就是生命。
  • 对于某些情况,只需 tree -L 2 xxx/tree -L 2 -d xxx/ 就足够了。
【解决方案4】:

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

我在玩鱼的时候找到了一个简单的解决方案,完全符合您的需求。

ll `ls`

ls -l $(ls)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2020-08-06
    • 2016-03-02
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多