我有两个目录,我需要以这种格式输出它们的差异
例子 :
DIR1 conatins : file1
file2
file3
DIR2 contains : file1
file4
输出(仅文件名,无文件内容):file1 被修改或相同,file2 被删除,file4 被添加
答案1
这是一个简单的问题,查看流行的工具diff
:
diff -r dir1 dir2
编辑:我把OP的问题弄错了,只获取信息那文件不同,而不是如何它们不同,您需要使用以下-q
选项:
diff -r -q dir1 dir2
答案2
comm
模拟或等工具如何join
比较两组排序的输入,使用bash
:
# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )
# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
name1=${files1[0]}
name2=${files2[0]}
if [[ $name1 == "$name2" ]]; then
# Name exists in both directories.
printf '%s is modified or same\n' "$name1"
files1=( "${files1[@]:1}" )
files2=( "${files2[@]:1}" )
elif [[ $name1 < $name2 ]]; then
# Name exists in only first directory.
printf '%s is removed\n' "$name1"
files1=( "${files1[@]:1}" )
else
# Name exists in only second directory.
printf '%s is added\n' "$name2"
files2=( "${files2[@]:1}" )
fi
done
# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
printf '%s is added\n' "${files2[@]}"
fi
我使用两个bash
数组来保存每个目录中找到的名称,然后进行迭代,直到其中一个数组为空。
在循环中,我将每个数组的名字相互比较。如果名称相同,则文件相同或可能已被修改(然后从两个数组中删除该名称)。
如果第一个数组中的名称排在第二个数组中的名称之前(使用 测试<
),则第二个目录中缺少第一个名称。现在删除第一个数组的第一个元素。
否则,第一个目录中将缺少第二个数组中的名称。现在删除第二个数组的第一个元素。
循环结束后,其中一个数组可能仍然非空,因此如果需要,请输出该数组中的名称。