在 debian/ubuntu 中我想要:
a)创建一个目录树中所有文件的列表
b)对第二个目录树执行相同操作
c)比较两个列表,只比较文件名(即只比较“file.txt”部分,以便“/home/folder/file.txt”==“/home/secondfolder/folder/file.txt”)d
)输出所有重复项的列表
有人可以解释一下如何使用脚本语言或正则表达式等来做到这一点吗?
答案1
使用find /some/dir -printf '%f\t%p\n > files<N>.lst'
或其某种变体在树中查找文件,然后join -j 1 files1.lst files2.lst
将文件列表合并为单个输出。
答案2
下面是一个可与 [t]csh、sh 等配合使用的示例,使用“find”、“awk”、“sort”、“uniq”和 /bin/sh 单行运行“md5sum”以获取每个文件的签名。有了两个目录结构文件的签名列表,命令序列将返回相同的文件:
查找 a/b/-type f-exec md5sum {} \; > /tmp/list; awk'{print $1}''| awk'{print $2}'| sh -c'while read s; do awk"/^$s/{print \$2}"/tmp/list; echo; done'
本质上,这会为“a”目录和“b”目录中的所有文件生成 md5sum。十六进制字符串(第一列)被输入到管道中,过滤出给定校验和的单个出现的实例,将其余部分传递给 /bin/sh 迭代器,该迭代器提取出与校验和匹配的所有实际文件(并在组之间插入空白行)。
它用空行分隔重复文件组。这提供了明显的优势(超出了原始请求),即查找内容相同但文件名不同的重复文件。