我有两个文件夹,里面有很多子文件夹和文件。例如:
/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
但正如所说的结果太大,并没有真正的帮助。
我该如何解决这个问题 - 最好使用单衬纸?
只是出于好奇:如何在使用 syde-by-side 时diff
显示(或输出到文件)整行?它通常以一定的长度切割线。
该ls -l
输出包括每个文件的修改时间,这很可能是这两个文件树之间的不同,这就是为什么diff
报告他们。
您应该使用find
's-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 diff
和man find
(关于 的部分-printf
),了解您可以打印关于文件的哪些内容,例如其大小。为了抑制find
输出中的文件夹,您应该-type f
在-printf
部分之前放置一个(即仅在打印前查找真实文件)。我的例子可能不能完全回答你的问题,但你明白了。
PS:diff
通常会在不同行附近输出一些上下文行,以便人和机器更容易在原始文件中找到这些行。事实上,在并排模式下,默认情况下diff
实际上将始终显示所有内容——无论是否存在差异。选项--suppress-common-lines
将抑制它。在正常模式下(不是并排),该选项也会稍微改变diff
-- 包括<
和>
在每行不同的前面的输出格式。也许这应该足够且易于阅读,因此您完全不需要并排选项。试试吧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句