我有两个文件夹,里面都有许多子文件夹和文件。例如:
/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
的-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 diff
和man 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/ || /'