• ベストアンサー

UNIXで、ディレクトリを比較して、ファイル・ディレクトリの存在を比較したい

やりたいこと自体は単純なことなのですが・・ UNIXのコマンドで、 2つのディレクトリA、Bを比較して、 Aだけにあるディレクトリ・ファイルのみを取得できるようなものを教えてください。 (ファイルが同一かどうかは問題ではなくて、あくまでも存在不存在の比較です。) コマンドを組み合わせたり、オプションを使ってもかまいません。 diffコマンドってこういうとき使えないのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

( 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)
回答No.6

シェルスクリプトの中で使うなら 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)
回答No.5

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 →両方にあるファイルを出力

回答No.3

diff A B | grep ^A ってのはダメなんでしょうか?もし純粋にファイル名だけをストリングとして欲しいなら、 diff A B | grep ^A | perl5 -e 'while(<STDIN>) { print "$2\n" if ($_ =~ /^([^:]*): (.*)/);}" …ダメでしょうか?

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

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のマニュアルページを見て戴くとして、、、。

回答No.1

一回だけ調べたいだけなら例えば ls -l `ls ../A` みたいな感じでどうですか。

noname#15902
質問者

補足

ご回答ありがとうございます。 おっしゃっているのは、 Bディレクトリに行き、 ls `ls ../A` で、Aディレクトリにのみ存在するものが、 「No such file or directory」 と表示される という意味だと思います。 質問に書いてないので申し訳ないのですが、 Aディレクトリの下にフォルダがあって、その中にファイルがあるというような深い階層も比較しようと考えています。 ls `ls ../A` だと深い階層のファイルは比較できないようです。 lsを使うとすれば -R オプションが関係ありそうだ、という感じはするのですが、 具体的にどうすればよいのかわかりません。 単純なことだと思っているので、複雑にしたくないと思っています。 尚、シェルスクリプトの中で使います。

関連するQ&A