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
.
使用标准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)
该文件file1
,file2
并且file4
都是空的,但file3
并file5
有一些内容。该命令显示有两组文件:file1
与file3
.
我们还可以确切地看到哪些文件是相同的:
$ 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)