我正在尝试将包含 1400 个子文件夹的文件夹与包含 1.399 个子文件夹的文件夹进行比较。我需要知道缺少哪个子文件夹。
我试过这个:
diff -rq dir1/ dir2/ | grep dir1/ | awk '{print $4}' > difference1.txt
但已经过去了 6 个小时了,还没有任何输出。ls
在文件夹中几乎是即时的,那么有没有比 diff 更快的方法?
答案1
diff -u <(ls dir1) <(ls dir2)
这将确保diff
不会查看子目录内部。
或者如果你勇敢的话试试这个;)
diff -u <(find dir1/ -maxdepth 1 -type d -exec basename {} \;) <(find dir2/ -maxdepth 1 -type d -exec basename {} \;)
答案2
对于 来说,这是一项相当简单的任务rsync
。
rsync -n -av dir1/ dir2/ | grep '/$' | grep -Fvx './'
rsync
这会将ingdir1
的内容试运行到 中dir2
,并仅显示以斜杠结尾的行(目录),顶级目录本身可能除外。
这是一个简单的测试/演示:
$ # create 1500 folders in dir1:
$ for i in $(jot -w %04d 1500); do mkdir -p dir1/dir-$i; done
$ # clone dir1 to dir2, then remove one directory:
$ rsync -a dir1/ dir2/
$ rmdir dir2/dir-0749/
$ # rsync -n will tell you which one is missing:
$ time rsync -n -av dir1/ dir2/ | grep '/$' | grep -Fvx './'
dir-0749/
real 0m0.038s
user 0m0.001s
sys 0m0.041s
如果您想采用此技术来检查 中缺少dir1
但存在的文件夹dir2
,请使用rsync
的--delete
选项:
$ rmdir dir1/dir-0479/
$ time rsync -nav --delete dir1/ dir2/ | grep '/$' | grep -Fvx './'
deleting dir-0479/
dir-0749/
该deleting ...
行告诉您dir-0479
不存在于dir1
但存在于 中dir2
。
答案3
尝试一下
ls dir1 > file1; ls dir2 > file2; diff file1 file2
或者如果你有 vimdiff 和 tree 这是子目录最有用的方式,你可以使用
tree dir1 > file1; tree dir2 > fiel2; vimdiff file1 file2
不过,运行 ls 比您所追求的 tree 快得多。
如果差异在于 dir1 中的子目录,例如。
dir1
- dir2
- dir3
- dir4
vs
dir2
- dir2
- dir3
你需要做
ls -R dir1 > file1; ls -R dir2 > file2; vimdiff file1 file2
答案4
diff <(树-d dir_A) <(树-d dir_B)