如何递归比较两个文件夹中文件的用户与组权限?
目录文件所有者/组权限对比方案
你要对比两个WordPress wp-content目录下共同存在的文件的所有者和组权限,同时避开修改时间这类无关差异,我给你整理了实用的解决方案:
1. 实现需求的单行命令
这个命令会自动找出两个目录都存在的文件,只提取权限、所有者和组信息进行对比,只输出有差异的内容,完全符合你的预期:
comm -12 <(find /wordpress/htdocs/wp-content -type f | sort) <(find /wordpress/htdocs2/wp-content -type f | sort) | while read f; do f2="${f/htdocs/wp-content/htdocs2/wp-content}"; stat1=$(stat -c "%A %U %G" "$f"); stat2=$(stat -c "%A %U %G" "$f2"); [ "$stat1" != "$stat2" ] && echo "$stat1 $f || $stat2 $f2"; done
命令解析:
comm -12 <(...) <(...):通过find生成两个目录的有序文件列表,再用comm提取出两者都存在的文件路径(取交集)while read f:循环处理每个共同存在的文件f2="${f/htdocs/wp-content/htdocs2/wp-content}":通过字符串替换,把第一个路径里的htdocs/wp-content换成htdocs2/wp-content,快速得到第二个目录对应的文件路径stat -c "%A %U %G":只提取文件的权限符号(比如-rw-rw-r--)、所有者和组,自动忽略修改时间、文件大小这些无关信息- 最后对比两个文件的提取信息,只有当内容不同时才输出你想要的格式
如果后续要对比权限的数值(比如664),只需要把stat的参数改成%a %U %G即可。
2. diff并排模式显示完整行
diff的并排模式默认会根据终端宽度截断行内容,你可以用-W参数指定足够大的宽度来显示完整行,比如:
diff -y -W 200 /wordpress/htdocs/usergroup.txt /wordpress/htdocs2/usergroup.txt
-y:启用并排对比模式-W 200:设置每行最大宽度为200(你可以根据自己的文件路径长度调整这个数值,比如设成300)
如果只想看差异行,还可以加上--suppress-common-lines参数,过滤掉内容相同的行,让结果更清晰:
diff -y -W 200 --suppress-common-lines /wordpress/htdocs/usergroup.txt /wordpress/htdocs2/usergroup.txt
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

