首页 > 解决方案 > 如何在两个不同的文件夹中递归比较用户和组?

问题描述

我有两个文件夹,里面都有很多子文件夹和文件。例如:

/wordpress/htdocs/wp-content/ 
/wordpress/htdocs2/wp-content/

在这两个文件夹下面,每个都有许多子文件夹和文件的完整结构。我想做的是比较两个子结构中存在的每个文件的所有权(在第二个命令权限中)。哪里有差异,我想让它们显示出来。

结果应如下所示:

-rw-rw-r-- 1 user1 group1 104343 Oct 23  2017 /wordpress/htdocs/wp-content/images/comment.jpg     ||    -rw-rw-r-- 1 user1 group2 104343 May 15  2018 /wordpress/htdocs2/wp-content/images/comment.jpg

执行我在此处搜索的命令后,将显示这两行,因为“相同”文件(相同文件但在不同文件夹中)的组不同。

user1 group1   ||   user1 group2

我尝试过的:

我尝试的是在两个文件夹中使用以下命令并比较输出文件。但是,这不起作用,因为几乎所有文件的修改时间都不同。因此,它不会将范围缩小到真正相关的信息。

sudo find . -exec ls -l -all {} \; | sudo tee usergroup.txt >/dev/null

然后我用这个命令来比较结果:

diff -c /wordpress/htdocs/usergroup.txt /wordpress/htdocs2/usergroup.txt

但正如所说,结果太大而且没有真正的帮助。

  1. 我该如何解决这个问题 - 最好用一个衬垫?

  2. 只是为了好奇:如何在使用 syde-by-side 时diff显示(或输出到文件中)整行?它通常以一定长度切割线。

标签: bashubuntu

解决方案


输出包括每个文件的ls -l修改时间,这很可能在两个文件树之间是不同的,这就是为什么要diff报告它们。

您应该使用find'-printf '…'选项并且只打印相关信息。这也将节省大量ls进程。在两棵树上执行两次,可以更合理地比较输出。

(顺便说一句,find报告文件和文件夹,并且您… -exec ls -al {} \;在文件夹上的内容将再次显示其内容 - 以及其他噪音,如...。您可以使用 来抑制它-d,但正如我已经说过的,您应该完全避免使用ls,因为它的主要目的是列出(因此是名称)目录的内容,而不是stat单个文件)。

diff并排模式使用-y时(默认是每行最多输出 130 个字符(我猜),但你可以用. 就个人而言,我会完全避免并排显示,但你去:-W

#!/bin/bash

diff -y -W 300 --suppress-common-lines \
    <(find /path1/wp-content -printf '%u %g %m %P\n') \
    <(find /path2/wp-content -printf '%u %g %m %P\n')

查看man diffman find(关于 的部分-printf),了解您可以打印关于文件的哪些内容,例如文件大小。为了从find输出中抑制文件夹,您应该-type f在部分之前放置一个-printf(即在打印之前只查找真实文件)。我的示例可能无法完全回答您的问题,但您明白了。

PS:diff通常会在不同的行附近输出一些上下文行,以便人类和机器更容易在原始文件中找到这些行。事实上,在并排模式下,diff实际上总是默认显示所有内容——无论是否存在差异。选项--suppress-common-lines将抑制这一点。在正常模式下(不是并排),该选项还会在一定程度上改变diff-- 的输出格式,包括每个不同<>的前面。也许这应该足够且易于阅读,因此您完全不需要并排选项。试一试。


推荐阅读