2011-12-20 11 views
1

それぞれに2つのフォルダがあり、多くのサブフォルダがあります。ほとんどのファイルとフォルダは同じにする必要がありますが、欠落しているフォルダを特定できるようにしたいと考えています。例えば不一致のフォルダがありません

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スクリプト、差分、またはpython/perlが動作するようにしました。

私は両方のフォルダのすべてを「diff -q -r Folder1 Folder2」とすることができますが、これはFOREVERを受け取り、変更されたものすべてを吐き出します。

提案がありますか?

ありがとうございます!

+0

どのくらい深く行きたいですか?つまり、 'A/B'が削除された場合は気になりますか? – fge

+0

ええ、ツリーの下を葉ノードまで下っていく必要がありますが、実際には、どの「包含する」ノードが削除されているかを知る必要があります。私。 1.jpgが削除されてもAが削除された場合は、他のフォルダから「A」を削除する必要があることだけを知る必要があります。 – Jordan

+0

ああ、それは問題をかなり変える! – fge

答えて

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

いくつかの注意:

  • これは、追加/削除されたファイルではなく、単に変更されたファイルが含まれます。追加/削除されたファイルを含めたくない場合は、findfind -type dに変更してください。
  • 特定のディレクトリが追加/削除された場合、内のすべてのファイルとディレクトリもそのディレクトリに一覧表示されます。それが問題ならば、| perl -ne 'print unless m/^\Q$previous\E\//; $previous = $_;'のようなものを追加することで対処できます。
  • バロンの答えは、フォルダを再帰的に調べる必要があると指定していないことを認識しています。最高レベルだけが必要な場合は、findfind -maxdepth 1(またはfind -maxdepth 1 -type d)またはls -d *(またはls -d */)のいずれかに変更できます。
+0

私は実際にそれを再帰的に必要とします、ちょうどそのことを忘れてしまった:)おっと! – Jordan

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 
+0

さて、 'sort'はあまりいい考えではないかもしれません。 –

1

これは、私はbashでそれを一緒にハッキング方法です:

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

私は、これは理想的なソリューションですが、私はまた、bashのを学んでいることから、私は聞いて興味があるという主張をしませんなぜこれが良いか悪いのか?

+2

OPはWindowsマシン上にあります。つまり、 '$ PWD'はスペース(' Documents and Settings'、 'Program Files'など)を含む可能性が非常に高いので、誤った単語分割を避けるために本当に必要です。 (実際にはUnix/Linuxの箱でも単語の分割が間違ってしまうのを避けるべきです - ファイル名のスペースもそこで合法ですがWindowsでは3倍になります) – ruakh

+0

また、私はした:私は質問が再帰的にディレクトリを比較することについて実際に尋ねていないことに気付かなかった! – ruakh

+0

@ruakhそれは少なくとも最初の質問だったが、コメントは私の答えを時代遅れにする。 ディレクトリ名のスペースについての点をありがとうございます。私は間違いなくそのことに注意する必要があります。 – Barron

1

あなたが本当にネスティング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 

することは、簡単なlsfindコマンドを交換してください。

関連する問題