- ベストアンサー
UNIXで、ディレクトリを比較して、ファイル・ディレクトリの存在を比較したい
やりたいこと自体は単純なことなのですが・・ UNIXのコマンドで、 2つのディレクトリA、Bを比較して、 Aだけにあるディレクトリ・ファイルのみを取得できるようなものを教えてください。 (ファイルが同一かどうかは問題ではなくて、あくまでも存在不存在の比較です。) コマンドを組み合わせたり、オプションを使ってもかまいません。 diffコマンドってこういうとき使えないのでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
( cd (ディレクトリA) ; find . -print |sort ) > A.txt ( cd (ディレクトリB) ; find . -print |sort ) > B.txt としてディレクトリリストを作っておいて diff A.txt B.txt | grep '^<' (Aだけにあるファイル) diff A.txt B.txt | grep '^>' (Bだけにあるファイル) でどうでしょうか?
その他の回答 (5)
- foobar
- ベストアンサー率44% (1423/3185)
シェルスクリプトの中で使うなら for name in `cd A ; find . -type f` do if [ ! -e B/$name ] then echo $name fi done みたいなのもありかも。 find でAの下のファイルを捜し出して、 if でBの下に有るかどうか調べて 無ければ それなりの処理(上記では echo )をする
- notnot
- ベストアンサー率47% (4900/10358)
diff -r で比較する場合、diff に -I オプション(違いを無視する)があれば、 diff -I ".*" -r A B で、両方にファイルがあれば内容にかかわらず一致とみなせるので、結果を見るのが楽になります。 #4の方の案のようにファイル一覧の入ったファイルを作って比較するなら、diffでなくcommを使うと便利です。 comm -23 A.txt B.txt →Aにだけあるファイルを出力 comm -13 A.txt B.txt →Bにだけあるファイルを出力 comm -12 A.txt B.txt →両方にあるファイルを出力
- sinobu_wednesday
- ベストアンサー率54% (701/1296)
diff A B | grep ^A ってのはダメなんでしょうか?もし純粋にファイル名だけをストリングとして欲しいなら、 diff A B | grep ^A | perl5 -e 'while(<STDIN>) { print "$2\n" if ($_ =~ /^([^:]*): (.*)/);}" …ダメでしょうか?
- foobar
- ベストアンサー率44% (1423/3185)
diff でもできるような気がします。 [tmp]$ ls a b a: aa ad b: aa ac で [tmp]$ diff -r a b bだけに発見: ac aだけに発見: ad という具合になりますので。 (OS: vine 2.6) 詳細はdiffのマニュアルページを見て戴くとして、、、。
- water-cooled
- ベストアンサー率14% (76/538)
一回だけ調べたいだけなら例えば ls -l `ls ../A` みたいな感じでどうですか。
補足
ご回答ありがとうございます。 おっしゃっているのは、 Bディレクトリに行き、 ls `ls ../A` で、Aディレクトリにのみ存在するものが、 「No such file or directory」 と表示される という意味だと思います。 質問に書いてないので申し訳ないのですが、 Aディレクトリの下にフォルダがあって、その中にファイルがあるというような深い階層も比較しようと考えています。 ls `ls ../A` だと深い階層のファイルは比較できないようです。 lsを使うとすれば -R オプションが関係ありそうだ、という感じはするのですが、 具体的にどうすればよいのかわかりません。 単純なことだと思っているので、複雑にしたくないと思っています。 尚、シェルスクリプトの中で使います。