AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 738530
Accepted
Black
Black
Asked: 2023-03-03 21:04:22 +0800 CST2023-03-03 21:04:22 +0800 CST 2023-03-03 21:04:22 +0800 CST

获取所有文件和目录的列表及其权限和所有者

  • 772

我需要在他们的许可和所有者的情况下生成所有文件和目录的列表,例如

-rw-rw-r--    black www-data     foo/
-rw-r--r--    black www-data     foo/foo.txt
-rw-rw-r--    black www-data     bar/
-rwxrwxr-x    black www-data     bar/foo.sh

我需要这个列表来将它与我有错误的另一个实例进行比较。

files
  • 5 5 个回答
  • 40 Views

5 个回答

  • Voted
  1. AdminBee
    2023-03-03T21:15:39+08:002023-03-03T21:15:39+08:00

    为了独立于有时动态变化的输出格式ls,我建议使用statwith--printf选项来控制输出格式。以下将以更“机器可读”的格式创建这样的列表,使用符号|作为分隔符(选择是任意的,请参阅最后一段了解更多信息):

    stat --printf="%A|%U|%G|%n\n" /path/to/dir/* > list_of_tiles.psv
    

    这将输出表单中的文件和属性列表

    -rw-rw-r--|black|www-data|foo.txt
    drw-rw-r--|black|www-data|bar/
    

    但是,默认情况下,这不会列出子目录中的文件和目录。要实现这一点,有几种方法:

    • 如果您使用的是 bash,则可以启用该globstar选项以允许递归执行通配符模式:

      shopt -s globstar
      stat --printf="%A|%U|%G|%n\n" /path/to/dir/** > list_of_tiles.psv
      

      带输出

      drwxr-xr-x|mygroup|myuser|subdir1
      -rw-r--r--|mygroup|myuser|subdir1/subfile1.txt
      -rw-r--r--|mygroup|myuser|subdir1/subfile2.txt
      drwxr-xr-x|mygroup|myuser|subdir2
      -rw-r--r--|mygroup|myuser|subdir2/subfile3.txt
      -rw-r--r--|mygroup|myuser|that_file.txt
      -rw-r--r--|mygroup|myuser|this_file.txt
      
    • 否则,您可能需要求助于 GNU find:

      find . -printf '%M|%g|%u|%p\n'
      

      带输出

      drwxr-xr-x|mygroup|myuser|.
      drwxr-xr-x|mygroup|myuser|./subdir1
      -rw-r--r--|mygroup|myuser|./subdir1/subfile1.txt
      -rw-r--r--|mygroup|myuser|./subdir1/subfile2.txt
      drwxr-xr-x|mygroup|myuser|./subdir2
      -rw-r--r--|mygroup|myuser|./subdir2/subfile3.txt
      -rw-r--r--|mygroup|myuser|./that_file.txt
      -rw-r--r--|mygroup|myuser|./this_file.txt
      
    • 如果两者都不可用,则这是两者的组合:

      find . -exec stat --printf="%A|%U|%G|%n\n" {} \;
      

    |另请注意,如果文件名本身不包含分隔符或换行符(不幸的是,这也是允许的字符),则这种方法只会真正成功地用于(自动?)比较。这是不鼓励通过脚本解析输出的ls 原因之一。这同样适用于任何分隔符的选择;这个答案之所以使用,是因为它在文件名中的出现频率低于例如空格。find|

    • 1
  2. Kusalananda
    2023-03-03T21:16:40+08:002023-03-03T21:16:40+08:00

    要在 Linux 上获取单个文件或目录的信息,您可以使用stat具有自定义输出格式的实用程序:

    $ stat -c '%A %U %G %n' ~/.bashrc
    -rw-r--r-- myself myself /home/myself/.bashrc
    

    您是否想要制表符分隔的输出,用作$'%A\t%U\t%G\t%n'选项的参数-c(在理解$'...'为 C 字符串的 shell 中)。

    要递归地获取当前目录及以下目录中所有内容的信息,请使用find:

    find . -exec stat -c $'%A\t%U\t%G\t%n' {} +
    

    在 BSD 系统(任何免费系统和 macOS)上,您需要使用stat -f '%Sp %Su %Sg %N'(每个S表示“符号”输出而不是数字)。在那里,您还可以使用%t插入标签:

    find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
    

    在 macOS 上运行示例:

    $ tree
    .
    ├── dir1
    │   └── file
    └── dir2
        └── othername
    
    3 directories, 2 files
    
    $ find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
    drwxr-xr-x  myself  staff   .
    drwxr-xr-x  myself  staff   ./dir2
    -rw-r--r--  myself  staff   ./dir2/othername
    drwxr-xr-x  myself  staff   ./dir1
    -rw-r--r--  myself  staff   ./dir1/file
    
    • 1
  3. Best Answer
    Stephen Kitt
    2023-03-03T22:25:10+08:002023-03-03T22:25:10+08:00

    如果你有 GNU find,你可以使用它的printf动作:

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

    这将列出当前目录和任何子目录中的所有文件,以及它们的类型和权限(样式ls、所有者和组)以及从当前目录开始的全名。

    如果你想要一致的间距,你可以使用字段宽度说明符,例如

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

    您可以使用 输出制表符\t。

    • 1
  4. Tux Over9000
    2023-03-03T21:09:14+08:002023-03-03T21:09:14+08:00

    我认为您需要将结果重定向到日志文件。尝试使用这个:

    ls -la /route/of/dir >> /route/ofyouneed/the/log/log.txt
    
    • 0
  5. Stéphane Chazelas
    2023-03-03T23:28:58+08:002023-03-03T23:28:58+08:00

    该zshshell 具有数组比较运算符和用于stat检索文件元数据的内置函数(自 1996 年以来,早于stat2000 年代初期的 GNU 和 BSD)。

    在那里你可以做:

    zmodload zsh/stat
    details=()
    for f ($dir/**/*(DN)) stat -LsH s -- $f && details+="$s[mode] $s[uid] $s[gid] $f:t"
    

    一旦您获得了两个数组中两个单独目录的结果(例如$details1和$details2,您可以执行以下操作:

    print -rC1 'Only in first:' ${details1:|details2}
    print -rC1 'Only in second:' ${details2:|details1}
    print -rC1 'In both:' ${details1:*details2}
    
    • 0

相关问题

  • 删除文件名后缀最小的文件

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve