如何比较两个文件夹的 ls 输出以查找丢失的目录?

如何比较两个文件夹的 ls 输出以查找丢失的目录?

我正在尝试将包含 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)

相关内容