【问题标题】:How to recursively list all files and directories如何递归列出所有文件和目录
【发布时间】:2010-10-04 19:43:00
【问题描述】:

在 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 显示文件的相对路径,但不显示所有者和组。

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    这个怎么样:

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

    【讨论】:

    • 如果路径中有空格,这看起来会失败,因为 awk 会创建另一个字段。有没有办法从 $9 打印到行尾?
    • 没错!您可以将 ls 输出读入一个函数,改变参数并使用 $@ 来读取“行的其余部分”,但老实说,它变得非常混乱,我只想写一个小的 Python 实用程序,用正确的方式来代替..
    • 或者尝试 slim 或 Chris 建议的 Perl 解决方案之一。
    • 路径中有空格?我以为这个问题被标记为“linux”
    • @Bruno9779 路径中的空格在 Linux 中是非常允许的——试试看——touch 'my file with spaces'。有些人不鼓励这样做,因为编写 shell 脚本很容易让它们窒息——但你不能阻止应用和用户创建带有空格的文件名。
    【解决方案2】:

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

    用途:

    tree -p -u -g -f -i
    

    tree -p -u -g -f
    

    或查看手册页以获取许多其他有用的参数。

    【讨论】:

    • 您也可以添加-a 标志来显示隐藏文件。
    【解决方案3】:

    在 Linux Debian 中工作:

    find $PWD -type f     
    

    【讨论】:

    • 在 Mac OS X Mountain Lion 上也能完美运行。谢谢。
    • 如果当前目录路径包含空格,请用双引号将$PWD 括起来:find "$PWD" -type f
    • 以防万一,它也适用于来自 GitHub for Windows 的 Git Bash。
    • 这不仅适用于开箱即用的 macOS,而且还不错、简短且令人难忘。虽然我意识到这个解决方案没有列出所有者和组。为此,您需要其他更详细的解决方案之一。
    【解决方案4】:

    find 接近:

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

    如果您希望路径相对于指定目录,还有“%P”,它会从文件名中删除前缀。

    注意这是GNU find,不知道BSD find是否也支持-printf。

    【讨论】:

    • BSD find 确实不支持-printf,但是将 GNU find 安装到 ~/bin/gnufi​​nd 很容易;)
    【解决方案5】:

    您已经得到了一个可行的答案,但作为参考,您应该能够在 BSD 上执行此操作(我已经在 mac 上测试过):

    find . -ls
    

    【讨论】:

      【解决方案6】:

      如果您喜欢使用 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";
      }
      

      【讨论】:

        【解决方案7】:

        我发现的简单方法是这样的:

        ls -lthr /path_to_directory/*

        “*” - 表示级别。

        Ajiths-MBP:test ajith$ ls -lthr *
        test2:
        total 0
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test2.txt
        
        test3:
        total 0
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test3.txt
        
        test1:
        total 0
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:21 test1.txt
        drwxr-xr-x  3 ajith  staff    96B Oct 17 18:22 test1_sub_dir
        
        
        Ajiths-MBP:test ajith$ ls -lthr */*
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:21 test1/test1.txt
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test2/test2.txt
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test3/test3.txt
        
        test1/test1_sub_dir:
        total 0
        -rw-r--r--  1 ajith  staff     0B Oct 17 18:22 test1_sub_file.txt
        

        【讨论】:

          【解决方案8】:

          使用 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, $_);
          }
          

          可能比其他答案更冗长,但应该可以解决问题,并且应该让您不必记住要输入的内容。 (代码未经测试。)

          【讨论】:

          • 看起来 OP 想要一个答案“[u]sing the tcsh shell on Free BSD”。
          猜你喜欢
          • 2010-10-19
          • 2010-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-31
          • 2011-07-11
          相关资源
          最近更新 更多