差异哪些文件夹丢失

时间:2011-12-20 22:23:55

标签: windows linux bash shell diff

我有两个文件夹,每个文件夹包含很多子文件夹。大多数文件和文件夹应该是相同的,但我希望能够找出丢失的文件夹。

例如:

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"被删除了?我正在运行Windows,但我已经安装了cygwin,因此bash脚本,diff或python / perl可以正常工作。

我知道我可以" diff -q -r Folder1 Folder2"两个文件夹中的所有内容,但这需要FOREVER并吐出所有更改的内容,包括那些文件夹中的文件,我只需要文件夹本身。

有什么建议吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

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

一些注意事项:

  • 这将包括添加/删除的文件,但不包括仅修改的文件。如果您甚至不想包含已添加/删除的文件,请将find更改为find -type d,正如herby建议的那样。
  • 如果添加/删除了给定目录,则还会列出该目录中的所有文件和目录。如果这是一个问题,您可以通过附加| perl -ne 'print unless m/^\Q$previous\E\//; $previous = $_;'
  • 之类的内容来解决它
  • Barron的回答让我意识到你并没有真正指定你需要递归检查文件夹。如果您只需要最高级别,则可以根据需要将find更改为find -maxdepth 1(或find -maxdepth 1 -type d)或ls -d *(或ls -d */

答案 1 :(得分:2)

(cd Folder1 && find . -type d >/tmp/$$.1)
(cd Folder2 && find . -type d >/tmp/$$.2)
diff /tmp/$$.1 /tmp/$$.2
rm /tmp/$$.1 /tmp/$$.2 

答案 2 :(得分:1)

这就是我在bash中一起攻击它的方式:

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

我没有声称这是一个理想的解决方案,但由于我也在学习bash,我很想知道为什么这是一个特别好或坏的方法。

答案 3 :(得分:1)

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

(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

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