Linux下递归对比目录时如何精准排除指定文件而非同名目录
Linux下递归对比目录时如何精准排除指定文件而非同名目录
嗨,这个需求其实用diff本身就能轻松搞定,关键是要写对排除的路径模式~
你要排除的是每个对比根目录下foo/dumb这个文件,但不想影响顶层dumb目录及其内容的对比,直接用diff的--exclude参数就能实现:
diff -r --exclude='foo/dumb' cool_1 cool_2
为什么这个命令能满足需求?
--exclude='foo/dumb'的作用是:在递归对比cool_1和cool_2时,跳过所有相对路径为foo/dumb的条目。- 顶层的
dumb目录相对路径是dumb,完全不会被这个模式匹配到,所以它下面的file1、file2都会正常参与对比。 - 而
cool_1/foo/dumb和cool_2/foo/dumb的相对路径正好是foo/dumb,会被精准排除,不会出现在diff结果里。
如果需要更严格区分文件/目录(可选)
如果担心某个foo/dumb是目录(而你只想排除同名文件),可以结合find命令来精确筛选要对比的文件,再进行内容对比,写法稍微复杂一点,但控制更精细:
# 找出两个目录中都存在的、符合条件的文件,逐个对比内容 comm -12 <(find cool_1 -type f ! -path '*/foo/dumb' | sort) <(find cool_2 -type f ! -path '*/foo/dumb' | sort) | while read file; do relative_path="${file#cool_1/}" diff "cool_1/$relative_path" "cool_2/$relative_path" done
这个命令会先筛选出两个目录中都存在的、不是foo/dumb的文件,再逐个对比它们的内容,完全不会涉及到排除目录的问题。
备注:内容来源于stack exchange,提问作者SirPentor
相关产品推荐
相关产品推荐

