我需要在他们的许可和所有者的情况下生成所有文件和目录的列表,例如
-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
我需要这个列表来将它与我有错误的另一个实例进行比较。
我需要在他们的许可和所有者的情况下生成所有文件和目录的列表,例如
-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
我需要这个列表来将它与我有错误的另一个实例进行比较。
为了独立于有时动态变化的输出格式
ls
,我建议使用stat
with--printf
选项来控制输出格式。以下将以更“机器可读”的格式创建这样的列表,使用符号|
作为分隔符(选择是任意的,请参阅最后一段了解更多信息):这将输出表单中的文件和属性列表
但是,默认情况下,这不会列出子目录中的文件和目录。要实现这一点,有几种方法:
如果您使用的是 bash,则可以启用该
globstar
选项以允许递归执行通配符模式:带输出
否则,您可能需要求助于 GNU
find
:带输出
如果两者都不可用,则这是两者的组合:
|
另请注意,如果文件名本身不包含分隔符或换行符(不幸的是,这也是允许的字符),则这种方法只会真正成功地用于(自动?)比较。这是不鼓励通过脚本解析输出的ls
原因之一。这同样适用于任何分隔符的选择;这个答案之所以使用,是因为它在文件名中的出现频率低于例如空格。find
|
要在 Linux 上获取单个文件或目录的信息,您可以使用
stat
具有自定义输出格式的实用程序:您是否想要制表符分隔的输出,用作
$'%A\t%U\t%G\t%n'
选项的参数-c
(在理解$'...'
为 C 字符串的 shell 中)。要递归地获取当前目录及以下目录中所有内容的信息,请使用
find
:在 BSD 系统(任何免费系统和 macOS)上,您需要使用
stat -f '%Sp %Su %Sg %N'
(每个S
表示“符号”输出而不是数字)。在那里,您还可以使用%t
插入标签:在 macOS 上运行示例:
如果你有 GNU
find
,你可以使用它的printf
动作:这将列出当前目录和任何子目录中的所有文件,以及它们的类型和权限(样式
ls
、所有者和组)以及从当前目录开始的全名。如果你想要一致的间距,你可以使用字段宽度说明符,例如
您可以使用 输出制表符
\t
。我认为您需要将结果重定向到日志文件。尝试使用这个:
该
zsh
shell 具有数组比较运算符和用于stat
检索文件元数据的内置函数(自 1996 年以来,早于stat
2000 年代初期的 GNU 和 BSD)。在那里你可以做:
一旦您获得了两个数组中两个单独目录的结果(例如
$details1
和$details2
,您可以执行以下操作: