你能区分一个目录中的所有文件吗?

eek*_*nky 9 command-line diff files

我有一堆文件存储在各种目录中。它们是在不同时间创建的,但我需要检查它们的内容是否相同。我找不到如何对diff一个目录中的所有文件进行操作。这是可能的还是需要另一个 CLI 工具?

小智 6

如果你并不需要对它们进行比较,并且只需要知道,如果他们不同,你可以只中DIFF与目录中的文件中的任何一个目录中的每个文件通过一个for循环...

for i in ./*; do diff -q "$i" known-file; done

...known-file目录中的任何给定文件在哪里。如果没有输出,则没有任何文件不同;否则,您将获得不同于known-file.


Kus*_*nda 6

使用标准cksum实用程序以及awk

find . -type f -exec cksum {} + | awk '!ck[$1$2]++ { print $3 }'
Run Code Online (Sandbox Code Playgroud)

cksum实用程序将为当前目录中的每个文件输出三列。第一个是校验和,第二个是文件大小,第三个是文件名。

awk程序将创建一个数组,ck,以校验和和大小为键。如果密钥不存在,则打印文件名。

这意味着您将获得当前目录中具有唯一校验和 + 大小的文件名。如果您得到多个文件名,则这两个具有不同的校验和/或大小。

测试:

$ ls -l
total 8
-rw-r--r--  1 kk  kk  0 Oct  3 16:32 file1
-rw-r--r--  1 kk  kk  0 Oct  3 16:32 file2
-rw-r--r--  1 kk  kk  6 Oct  3 16:32 file3
-rw-r--r--  1 kk  kk  0 Oct  3 16:32 file4
-rw-r--r--  1 kk  kk  6 Oct  3 16:34 file5

$ find . -type f -exec cksum {} + | awk '!ck[$1$2]++ { print $3 }'
./file1
./file3
Run Code Online (Sandbox Code Playgroud)

该文件file1file2并且file4都是空的,但file3file5有一些内容。该命令显示有两组文件:file1file3.

我们还可以确切地看到哪些文件是相同的:

$ find . -type f -exec cksum {} + | awk '{ ck[$1$2] = ck[$1$2] ? ck[$1$2] OFS $3 : $3 } END { for (i in ck) print ck[i] }'
./file3 ./file5
./file1 ./file2 ./file4
Run Code Online (Sandbox Code Playgroud)