如何在两个不同的文件夹中递归比较用户和组?



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

/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显示(或输出到文件中(行?它通常会以一定的长度切割线。

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 %Pn') 
<(find /path2/wp-content -printf '%u %g %m %Pn')

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

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

可以说,解决这个问题的一种非常人为的方法:

find /wordpress/htdocs/wp-content/ a/wordpress/htdocs2/wp-content/ 
-type f -exec stat {} --printf '%n %An' ; | 
sed 's!.*/wp-content/!!' | sort | uniq -u | sed 'N;s/n/ || /'

最新更新