将两个目录中的文件与 Linux 中的第三个目录进行比较
Compare the presence of files in two directories to third directory in Linux
如何将 dir1
和 dir2
中的文件与 dir3
中的文件进行比较。
例如:
dir1 dir2 dir3
file1 file2 file1
file3 file4 file2
file5 file6 file3
file9 file5
file6
file7
输出如下:
only in dir1: file9
only in dir2: file4
only in dir3: file7
编辑:
我正在寻找使用命令行的差异,而且我使用的是 centos 7。
我用diff dir1 dir2
比较了两个目录,我发现diff3
比较了三个文件,但没有比较三个目录。
meld 是一个很好的图形 diff 前端,它将向您显示文件的并排列表。使用 Ubuntu 软件中心安装 meld:
sudo apt-get install meld
meld dir1 dir2 dir3
检查是否对您有帮助
这一小行 unix 命令可以为您做到这一点。但它仅在您的文件和目录不包含 whitespace:
时才有效
find dir{1..3} -mindepth 1 -type f | tr '/' ' ' | sort -k2,2 | uniq -u -f 1 | sed -e 's/ /: /' -e 's/^/only in /'
查找首先列出所有目录及其文件。根据您的需要调整它,您的目录实际上可能不是 dir1、dir2 和 dir3。
然后我们将路径的'/'替换为space,因为uniq
只能通过whitespace来确定字段。我们对第二个字段(文件)进行排序。比我们只打印第二个字段的唯一行,跳过第一个字段 (-f 1)。比我们使用 sed 更好地打印唯一路径。
另一个变体:
find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort
dir1/file9
dir2/file4
dir3/file7
化妆品:
find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort | sed 's/dir/Only in dir/g' | sed 's/\//: /g'
Only in dir1: file9
Only in dir2: file4
Only in dir3: file7
在 GNU awk 中:
$ awk 'BEGINFILE {
n=split(FILENAME,t,"/") # I should use gensub here too
f[t[n]]++ # count distinct filenames
p[t[n]]=gensub(/\/[^/]*$/,"",1,FILENAME) # store path (collisions dont matter)
}
END {
for(i in f) # all files encountered
if(f[i]==1) # look for singles
printf "only in %s: %s\n", p[i], i # ... and output them
}' dir1/* dir2/* dir3/* # or dir[123]/*
输出:
only in dir1: file9
only in dir2: file4
only in dir3: file7
对于非 GNU awks:
$ for i in dir[123]/*
do echo $i
done |
awk -F/ ' {
t=$NF
f[t]++
sub(/\/[^/]*$/,"")
p[t]=[=12=]
}
END {
for(i in f)
if(f[i]==1)
printf "only in %s: %s\n", p[i], i
}'
用 awk 查找:
find . -mindepth 2 -name '*' |
awk -F/ '
{
seen[$NF]++
path[$NF] = $(NF-1)
}
END {
for(i in seen) {
if(seen[i]==1)
print "only in "path[i] ": " i
}
}
'
如何将 dir1
和 dir2
中的文件与 dir3
中的文件进行比较。
例如:
dir1 dir2 dir3
file1 file2 file1
file3 file4 file2
file5 file6 file3
file9 file5
file6
file7
输出如下:
only in dir1: file9
only in dir2: file4
only in dir3: file7
编辑:
我正在寻找使用命令行的差异,而且我使用的是 centos 7。
我用diff dir1 dir2
比较了两个目录,我发现diff3
比较了三个文件,但没有比较三个目录。
meld 是一个很好的图形 diff 前端,它将向您显示文件的并排列表。使用 Ubuntu 软件中心安装 meld:
sudo apt-get install meld
meld dir1 dir2 dir3
检查是否对您有帮助
这一小行 unix 命令可以为您做到这一点。但它仅在您的文件和目录不包含 whitespace:
时才有效find dir{1..3} -mindepth 1 -type f | tr '/' ' ' | sort -k2,2 | uniq -u -f 1 | sed -e 's/ /: /' -e 's/^/only in /'
查找首先列出所有目录及其文件。根据您的需要调整它,您的目录实际上可能不是 dir1、dir2 和 dir3。
然后我们将路径的'/'替换为space,因为uniq
只能通过whitespace来确定字段。我们对第二个字段(文件)进行排序。比我们只打印第二个字段的唯一行,跳过第一个字段 (-f 1)。比我们使用 sed 更好地打印唯一路径。
另一个变体:
find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort
dir1/file9
dir2/file4
dir3/file7
化妆品:
find dir*/ -type f | sort -t/ -k2 | uniq -u -s 4 | sort | sed 's/dir/Only in dir/g' | sed 's/\//: /g'
Only in dir1: file9
Only in dir2: file4
Only in dir3: file7
在 GNU awk 中:
$ awk 'BEGINFILE {
n=split(FILENAME,t,"/") # I should use gensub here too
f[t[n]]++ # count distinct filenames
p[t[n]]=gensub(/\/[^/]*$/,"",1,FILENAME) # store path (collisions dont matter)
}
END {
for(i in f) # all files encountered
if(f[i]==1) # look for singles
printf "only in %s: %s\n", p[i], i # ... and output them
}' dir1/* dir2/* dir3/* # or dir[123]/*
输出:
only in dir1: file9
only in dir2: file4
only in dir3: file7
对于非 GNU awks:
$ for i in dir[123]/*
do echo $i
done |
awk -F/ ' {
t=$NF
f[t]++
sub(/\/[^/]*$/,"")
p[t]=[=12=]
}
END {
for(i in f)
if(f[i]==1)
printf "only in %s: %s\n", p[i], i
}'
用 awk 查找:
find . -mindepth 2 -name '*' |
awk -F/ '
{
seen[$NF]++
path[$NF] = $(NF-1)
}
END {
for(i in seen) {
if(seen[i]==1)
print "only in "path[i] ": " i
}
}
'