为什么
我有两个文件夹应该包含完全相同的文件,但是,当我查看文件数量时,它们是不同的。我想知道一个文件/文件夹中存在哪些文件/文件夹,而不是另一个。我的想法是我将列出所有文件,然后使用 comm 查找两个文件夹之间的差异。
问题
如何以 /path/to/dir 和 /path/to/dir/file 格式递归地列出文件和文件夹?
重要笔记
操作系统:Windows 11,子系统 Ubuntu 20.04.4 LTS
位置文件夹:一个网络驱动器,一个本地驱动器
文件夹大小:每个~2tb
请注意, Unix 上的目录只是众多文件类型中的一种。使用
find
,您可以使用 搜索它们-type d
,或使用/
zsh glob 中的限定符。其他类型的文件包括常规文件(-type f
,.
glob 限定符,可能是您所说的file),还有符号链接(-type l
/@
)、设备、fifos、套接字......要获取目录类型的文件,您可以执行以下操作:
对于任何其他类型的文件:
对于
dir2
.现在有3个主要问题:
dir1/
比较更加困难。dir1
dir2/
dir2
可以使用 GNU
find
并sort
使用以下方法解决这些问题:在哪里:
%P
打印文件相对于 dir1的路径现在,您可以将列表与以下内容进行比较:
该输出不能可靠地进行后处理,因为我们将 NUL 转换回换行符以显示并
comm
使用 TAB 来分隔在文件路径中再次有效的列。或者,您可以获取 zsh 数组中的列表并使用其数组比较运算符:
然后:
并对这些数组做你必须做的事情,就像
print
他们r
在 olumn 上的 aw一样1
C
:(或
N
UL 分隔,因此可以通过添加-N
选项对其进行后处理)。您不需要任何这些,只需使用
diff -qr dir1 dir2
. 例如:如果我现在在两个目录上运行
diff -qr
(-r
对于“递归”并且-q
仅在文件不同时报告,而不显示实际差异),我得到:也就是说,获取文件列表的方法是
find
:然后,您可以删除
dir1/
和dir2/
using ,并在支持它的 shell 中使用进程替换sed
来比较两个目录的输出:请注意,这假定文件名没有换行符。如果您需要处理这些,只需使用上述
diff -r
方法。尝试
sort
用于确保相同的顺序,以及较小的结果diff
orcomm
list1.file
就list2.file
不会“污染”结果。