区分哪些文件夹丢失

我有两个包含大量子文件夹的文件夹。 大多数文件和文件夹应该是相同的,但我想能够找出哪些文件夹丢失。

例如:

Folder1/ A/ 1.jpg B/ 2.jpg C/ 3.jpg D/ 4.jpg 

 Folder2/ A/ 1.jpg E/ 2.jpg C/ 3.jpg D/ 4.jpg 

有什么方法可以知道“B”被删除了吗? 我正在运行窗口,但我已经安装了cygwin所以bash脚本,diff或python / perl将工作。

我知道我可以只是“diff -q -r Folder1 Folder2”在这两个文件夹中的一切,但这需要永远,并吐出一切改变,包括在这些文件夹中的文件,我只需要文件夹本身。

有什么build议么?

谢谢!

 diff -u <(cd Folder1 ; find | sort) <(cd Folder2 ; find | sort) 

一些说明:

  • 这将包括添加/删除的文件,但不包括仅被修改的文件。 如果你甚至不想包括被添加/删除的文件,那么改变findfind -type d ,正如herby所暗示的那样。
  • 如果给定的目录被添加/删除,这也将列出该目录内的所有文件和目录。 如果这是一个问题,你可以通过追加类似的东西来解决它 | perl -ne 'print unless m/^\Q$previous\E\//; $previous = $_;'
  • Barron的回答让我意识到,你并没有真正指定你需要递归检查文件夹。 如果你只是需要最高级别的话,你可以根据需要改变findfind -maxdepth 1 (或者find -maxdepth 1 -type d )或者ls -d * (或者ls -d */ )。
 (cd Folder1 && find . -type d >/tmp/$$.1) (cd Folder2 && find . -type d >/tmp/$$.2) diff /tmp/$$.1 /tmp/$$.2 rm /tmp/$$.1 /tmp/$$.2 

这就是我在bash中一起砍死它的原因:

 dirs=`ls $PWD/Folder1` for dir in ${dirs[*]}; do if [ ! -e $PWD/Folder2/$dir ]; then echo "$dir missing" fi done 

我不认为这是一个理想的解决方案,但是因为我也在学习bash,所以我很想知道为什么这是一个特别好或坏的方法去做。

如果你真的只想要一层嵌套,你可以这样做:

 (cd Folder1 && find -type d -mindepth 1 -maxdepth 1) >list1 (cd Folder2 && find -type d -mindepth 1 -maxdepth 1) >list2 while read dir; do fgrep -qx "$dir" list2 || echo "\"$dir\" has been deleted" done <list1 

如果您确定只有两个文件夹中都有目录,请用简单的ls替换find命令。