2009-02-01 68 views
23

在Free BSD上使用tcsh shell,是否有递归列出所有文件和目录的方法,包括文件的所有者,组和相对路径?如何递归列出所有文件和目录

LS -alR接近,但它并没有显示在每个文件前面的相对路径,它显示了一个即分组

owner% ls -alR 
total 0 
drwxr-xr-x 3 owner group 102 Feb 1 10:50 . 
drwx------+ 27 owner group 918 Feb 1 10:49 .. 
drwxr-xr-x 5 owner group 170 Feb 1 10:50 subfolder 

./subfolder: 
total 16 
drwxr-xr-x 5 owner group 170 Feb 1 10:50 . 
drwxr-xr-x 3 owner group 102 Feb 1 10:50 .. 
-rw-r--r-- 1 owner group  0 Feb 1 10:50 file1 
-rw-r--r-- 1 owner group  0 Feb 1 10:50 file2 

顶部的路径是什么,我想是输出,如:

owner group ./relative/path/to/file 

accepted answer to this question显示了一个文件的相对路径,但不显示所有者和组。

回答

24

如何:

find . -exec ls -dl \{\} \; | awk '{print $3, $4, $9}' 
+0

如果路径中有空格,awk会创建另一个字段,看起来会失败。 有没有办法从$ 9打印到行尾? – Ben 2009-02-02 16:42:49

+0

就是你!你*可以*将ls输出读入函数,通过参数移动你的方式并使用$ @来读取“剩下的部分”,但老实说,它已经变得很混乱,我只需要编写一个Python实用程序,然后做它正确的方式,而不是.. – 2009-02-02 17:11:46

+0

或尝试一个由瘦身或克里斯建议的Perl解决方案。 – 2009-02-02 17:32:27

10

find接近:

find . -printf "%u %g %p\n" 

还有 “%P”,如果你想的路径是相对的,其将删除的文件名前缀,到指定的目录。

请注意,这是GNU查找,我不知道BSD查找是否也支持-printf。

-4

使用shell脚本。或者一个Perl脚本。例如Perl脚本(因为它更容易为我做的):

#!/usr/bin/perl 
use strict; 
use warnings; 
foreach(`find . -name \*`) { 
    chomp; 
    my $ls = `ls -l $_`; 
    # an incomprehensible string of characters because it's Perl 
    my($owner, $group) = /\S+\s+\S+\s+(\S+)\s+(\S)+/; 
    printf("%-10s %-10s %s\n", $owner, $group, $_); 
} 

也许有点超过其他答案详细,但应该做的伎俩,并应保存你不必记住什么类型。 (代码未经测试)

4

如果您喜欢使用Perl,请不要将其用作shell命令的包装。在本地Perl中执行它更快,更便携,更有弹性。另外它避免了临时正则表达式。

use File::Find; 
use File::stat; 

find (\&myList, "."); 

sub myList { 
    my $st = lstat($_) or die "No $file: $!"; 

    print getgrnam($st->gid), " ", 
      getpwuid($st->uid), " ", 
      $File::Find::name, "\n"; 
} 
18

使用。很少有Linux发行版默认安装它(在这些暗天只有GUI :-),但它始终在标准存储库中可用。它应该是适用于* BSD也看到http://mama.indstate.edu/users/ice/tree/

用途:

tree -p -u -g -f -i 

tree -p -u -g -f 

或检查手册页许多其他有用的参数。

6

你已经有了这样的作品,但引用你应该能够做到这一点的BSD系统的答案(我测试过它在Mac):

find . -ls 
14

作品中的Linux Debian的:

find $PWD -type f  
相关问题