使用 bash 确定目录 A 中不存在于目录 B 和 C 中的文件
Use bash to determine files in Directrory A that do not exist in Directories B and C
我有一个包含文件的目录(目录 A)。
目录 B 和 C 包含目录 A 中的文件(B 中没有文件在 C 中,反之亦然)。
如何列出目录 A 中不存在于目录 B 和 C 中的文件?
如果您不需要在非常大批量的情况下快速处理:
for f_path in a/*; do f=${f_path#a/}
[[ -e "b/$f" || -e "c/$f" ]] && continue
printf '%s\n' "$f"
done
如果您做,并且有 GNU comm
、find
和 sort
,请参阅以下内容——当然,替换tr
如果您希望能够安全地处理所有可能的文件名,最后的代码实际上会正确读取以 NUL 分隔的列表:
comm -z23 <(find a -maxdepth 1 -printf '%P[=11=]' | sort -z) \
<(find b c -maxdepth 1 -printf '%P[=11=]' | sort -z) \
| tr '[=11=]' '\n'
有关 comm
用法的更多信息,请参阅 BashFAQ #36。
我有一个包含文件的目录(目录 A)。
目录 B 和 C 包含目录 A 中的文件(B 中没有文件在 C 中,反之亦然)。
如何列出目录 A 中不存在于目录 B 和 C 中的文件?
如果您不需要在非常大批量的情况下快速处理:
for f_path in a/*; do f=${f_path#a/}
[[ -e "b/$f" || -e "c/$f" ]] && continue
printf '%s\n' "$f"
done
如果您做,并且有 GNU comm
、find
和 sort
,请参阅以下内容——当然,替换tr
如果您希望能够安全地处理所有可能的文件名,最后的代码实际上会正确读取以 NUL 分隔的列表:
comm -z23 <(find a -maxdepth 1 -printf '%P[=11=]' | sort -z) \
<(find b c -maxdepth 1 -printf '%P[=11=]' | sort -z) \
| tr '[=11=]' '\n'
有关 comm
用法的更多信息,请参阅 BashFAQ #36。