【问题标题】:Diff which folders are missing区分缺少哪些文件夹
【发布时间】:2011-12-20 22:23:55
【问题描述】:

我有两个文件夹,每个文件夹都包含很多子文件夹。大多数文件和文件夹应该是相同的,但我希望能够弄清楚哪些文件夹丢失了。

例如:

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 并吐出所有更改的内容,包括这些文件夹中的文件,我只需要文件夹本身。

有什么建议吗?

谢谢!

【问题讨论】:

  • 你想去多深?即,你介意A/B 被删除吗?
  • 是的,我需要沿着树一直走到叶节点,但我真的只需要知道哪些“包含”节点被删除了。 IE。如果 1.jpg 被删除但 A 也被删除,我真的只需要知道我应该从另一个文件夹中删除“A”。
  • 啊,问题大有改观!

标签: windows linux bash shell diff


【解决方案1】:
diff -u <(cd Folder1 ; find | sort) <(cd Folder2 ; find | sort)

一些注意事项:

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

【讨论】:

  • 我实际上确实需要它递归,只是忘了提及 :) 哎呀!
【解决方案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 

【讨论】:

  • 好吧,sort 也可能是个不错的主意。
【解决方案3】:

这就是我在 bash 中破解它的方式:

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

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

【讨论】:

  • OP在Windows机器上,这意味着$PWD很可能包含空格(Documents and SettingsProgram Files等),所以你真的需要小心避免不正确的分词。 (实际上,即使在 Unix/Linux 机器上,你也应该注意避免不正确的分词——文件名中的空格在那里也是合法的——但在 Windows 上是三倍的。)
  • 另外,您显然比 herby 或我读得更好:我没有注意到这个问题实际上并没有询问递归比较目录!
  • @ruakh 好吧,这至少是最初的问题,但是 cmets 让我的答案过时了。感谢有关目录名称中空格的观点。我绝对应该对此更加小心。
【解决方案4】:

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

(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2014-09-20
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多