比较两个文件的不同之处,忽略部分行

比较两个文件的不同之处,忽略部分行

我想比较文件系统。目前我的 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

现在让我们创建一个测试。这里我们有两个目录,一个目录有一个文件,另一个目录没有;另一个目录ba+x1

$ 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。

http://manpages.debian.net/cgi-bin/man.cgi?query=find

答案3

如果您只想要权限部分ls,那么您可以使用它来解析它awk

ls -l your-file | awk '{print $1;}'

或者,您可以使用以下方式检查 PHP 脚本中的权限文件权限功能。

相关内容