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

时间:2018-05-19 00:41:18

标签: bash ubuntu

我有两个文件夹,其中包含许多子文件夹和文件。例如:

/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显示(或输出到文件中)整个行?它通常会在一定的时间内切断线。

2 个答案:

答案 0 :(得分:0)

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

您应该使用find' -printf '…'选项并仅打印相关信息。这也可以节省大量的ls进程。在两棵树上做两次,输出可以更加明智地比较。

(顺便说一句,find报告文件和文件夹,文件夹上的… -exec ls -al {} \;会显示其内容 - 以及...等其他噪音你可以用-d来抑制它,但正如我已经说过的,你应该完全避免使用ls,因为它的主要目的是 list (因此,名称)目录的内容,而不是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的输出格式 - 包括<>在每个不同的行前面。也许这应该足够且易于阅读,因此您根本不需要并排选项。试试吧。

答案 1 :(得分:0)

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

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p);
  console.log('reason:', reason);
});