如何使用bash comm命令获取目录A与B各自独有的文件
你观察到的行前制表符不是输入内容带的,是comm命令本身的输出格式设计:
comm默认输出三列内容,列之间用制表符分隔:- 第一列:仅在第一个输入流(也就是你A目录的find结果)中存在的行
- 第二列:仅在第二个输入流(B目录的find结果)中存在的行
- 第三列:两个输入流共有的行
- 你加了
-3参数,作用是隐藏第三列的公共内容,所以最终输出里,开头带制表符的是第二列内容(仅B目录存在的文件),不带制表符的是第一列内容(仅A目录存在的文件)。
你得到的结果里两组文件名被判定为不同,核心原因是文件名本身就不匹配:你列出来的条目一组后缀是大写的JPG,一组是小写的jpeg,comm是严格逐字符比较的,大小写、后缀的差异都会被识别为不同文件,不是你命令逻辑有误。
如果你的需求是忽略大小写、或忽略后缀差异匹配文件名,可以对find的输出做预处理再比较:
- 仅忽略大小写匹配,命令修改为:
comm -3 <(find /Users/rob/A -type f -exec basename {} ';' | tr '[:upper:]' '[:lower:]' | sort) <(find "/Users/rob/B" -type f -exec basename {} ';' | tr '[:upper:]' '[:lower:]' | sort)
- 忽略大小写+忽略后缀,仅匹配主文件名:
comm -3 <(find /Users/rob/A -type f -exec basename {} ';' | sed 's/\.[^.]*$//' | tr '[:upper:]' '[:lower:]' | sort) <(find "/Users/rob/B" -type f -exec basename {} ';' | sed 's/\.[^.]*$//' | tr '[:upper:]' '[:lower:]' | sort)
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

