![比较两个文件的不同之处,忽略部分行](https://linux22.com/image/1310418/%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E4%B8%8D%E5%90%8C%E4%B9%8B%E5%A4%84%EF%BC%8C%E5%BF%BD%E7%95%A5%E9%83%A8%E5%88%86%E8%A1%8C.png)
我想比较文件系统。目前我的 bash 脚本将文件系统递归打印到文件中 (ls -l -R),并将其与预期输出进行比较。
此文件中一行的示例为:drw---- 100000f3 00000400 0 ./foo/
我当前的 diff 命令是 diff "$TEMP_LOG" "$DIFF_FILE_OUT" --strip-trailing-cr --changed-group-format='%>' --unchanged-group-format='' >> "$SubLog"
正如您所看到的,我忽略了当前输出文件中的其他行,我只关心与主输出匹配的行。
我现在遇到的问题是,某些文件的大小可能不同,或者文件夹甚至可能有不同的名称,但由于它的位置,我知道它应该具有什么访问权限。
例如:
Output:
------- 00000000 00000000 528 ./foo/bar.txt
Master:
------- 00000000 00000000 200 ./foo/bar.txt
这里只有大小不同,但这并不重要,我只想忽略差异的某些部分,有点像 ansi c 注释。
Master:
------- 00000000 00000000 /*200*/ ./foo/bar.txt
- 或者 -
Master:
d------ 00000000 00000000 /*10*/ ./foo//*123123*///*76456546*//bar.txt
Output:
d------ 00000000 00000000 0 ./foo/asd/sdf/bar.txt
并且仍然正确具有差异。
使用 diff 是否可行,还是我必须为其编写自定义脚本?由于我对 cygwin 还不熟悉,我可能使用了完全错误的工具,因此我很乐意听取任何建议。
更新 1:
退一步来说,这是我想要完成的一般任务。我想编写一个脚本来检查文件系统,以查看读/写权限是否设置正确。文件系统的结构在我的控制之下,所以我不必担心它会改变太多。有时文件夹/文件可能不存在,但如果存在,则必须检查它们的权限。
例如,假设以下是当前文件系统结构的快照
drw ./foo
drw ./foo/bar
-rw ./foow/bar/bar.txt
drw ./foo/baz
-rw ./foo/baz/baz.txt
这就是文件系统结构可能决定的,即,如果这些文件夹/文件存在,则权限必须匹配。
drw ./foo
drw ./foo/bar
-rw ./foo/bar/bar.txt
--- ./foo/bar/foobar.txt
drw ./foo/baz
-rw ./foo/baz/foobaz.txt
在这种情况下,文件系统检查正常,因为所有文件都符合预期值。一旦某些文件夹可能具有任意名称,情况就会变得更加复杂,仅根据它们的位置,我才知道它们的权限应该是什么。假设上例中的目录 ./foo/bar 可能就是这样的情况,即文件夹可以具有任何名称,而不是 bar,但仍符合 -rw 权限。
这似乎是一个非常复杂的情况,我甚至不确定我是否可以仅使用 bash 脚本来解决它。我可能不得不编写一个实际的应用程序。
更新 2:
请注意我无法直接在文件系统上运行工具。我所拥有的只是一个包含“ls -l 'R'”命令输出的文件,该命令产生如上所示的输出。
我添加了一些额外的输出解析,系统/主输出现在具有以下格式
d------ ./path
drw---- ./path2
答案1
它可能更容易被滥用rsync
来获取你想要的东西,并可能完成整个任务,尽管你可能不得不抑制它更新文件的欲望——无论如何,这是 rsync 的日常工作:
rsync --existing -iprvn a/ b
选项如下:
--existing skip creating new files on receiver
-p, --perms preserve permissions
-i, --itemize-changes output a change-summary for all updates
-r, --recursive recurse into directories
-v, --verbose increase verbosity
-n, --dry-run perform a trial run with no changes made
现在让我们创建一个测试。这里我们有两个目录,一个目录有一个文件,另一个目录没有;另一个目录b
也a+x
有1
。
$ ls -lah a/ b/
a/:
total 8.0K
drwxrwxr-x 2 ecarroll ecarroll 4.0K Apr 5 16:38 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr 5 16:38 ..
-rw-rw-r-- 1 ecarroll ecarroll 0 Apr 5 16:38 1
-rw-rw-r-- 1 ecarroll ecarroll 0 Apr 5 16:38 2
-rw-rw-r-- 1 ecarroll ecarroll 0 Apr 5 16:38 5
b/:
total 8.0K
drwxrwxr-x 2 ecarroll ecarroll 4.0K Apr 5 16:52 .
drwxr-xr-x 71 ecarroll ecarroll 4.0K Apr 5 16:38 ..
-rwxrwxr-x 1 ecarroll ecarroll 0 Apr 5 16:52 1
-rw-rw-r-- 1 ecarroll ecarroll 0 Apr 5 16:52 5
-rw-rw-r-- 1 ecarroll ecarroll 0 Apr 5 16:38 7
现在让我们运行 rsync。
$ rsync --existing -icprvn a/ b
sending incremental file list
.f...p..... 1
sent 97 bytes received 15 bytes 224.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
f
表示它是一个文件。p
表示权限已关闭。1
只是我的示例文件的名称。
答案2
我认为你所需要的是:
find . -type f -printf "%M %p\n"
鉴于此,您可能可以写入文件并使用 diff。