Diff, какие папки отсутствуют - PullRequest
1 голос
/ 21 декабря 2011

У меня есть две папки, каждая из которых содержит много подпапок.Большинство файлов и папок должны быть одинаковыми, но я хочу выяснить, какие папки отсутствуют.

Например:

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" все в обеих папках, но это берет навсегда и выплевывает все, что изменилось, включая файлы в этих папках, где мне просто нужны сами папки.

Есть предложения?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011
diff -u <(cd Folder1 ; find | sort) <(cd Folder2 ; find | sort)

Некоторые примечания:

  • Это будет включать в себя файлы, которые добавляются / удаляются, но не файлы, которые просто изменены.Если вы даже не хотите включать файлы, которые добавляются / удаляются, измените find на find -type d, как предлагает herby.
  • Если данный каталог добавлен / удален, в нем также будут перечислены всефайлы и каталоги внутри этого каталога.Если это проблема, вы можете решить ее, добавив что-то вроде | perl -ne 'print unless m/^\Q$previous\E\//; $previous = $_;'.
  • Ответ Баррона дает мне понять, что вы на самом деле не указали, что вам нужны рекурсивные проверки папок.Если вам нужен только самый верхний уровень, вы можете изменить find на find -maxdepth 1 (или find -maxdepth 1 -type d) или ls -d * (или ls -d */), как вам удобнее.
2 голосов
/ 21 декабря 2011
(cd Folder1 && find . -type d >/tmp/$$.1)
(cd Folder2 && find . -type d >/tmp/$$.2)
diff /tmp/$$.1 /tmp/$$.2
rm /tmp/$$.1 /tmp/$$.2 
1 голос
/ 21 декабря 2011

Если вам действительно нужен только один уровень вложенности, вы можете сделать это:

(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.

1 голос
/ 21 декабря 2011

Вот как я взломал это вместе в bash:

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

Я не утверждаю, что это идеальное решение, но так как я также изучаю bash, мне было бы интересно услышать, почему это особенно хороший или плохой способ сделать это.

...