• ベストアンサー

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

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

noname#15902
noname#15902

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

  • ベストアンサー
回答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% (4846/10257)
回答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

  • ファイルを比較して検索するソフト

    ハードディスク内で、画像、文書、ソフトなどにおいて、ファイル名は異なっているものの、同一ファイルを見つけ出す方法として、diff コマンド(-r オプションで、フォルダ又はディレクトリ単位で比較。テキスト、バイナリのどちらでも比較可。違う場所があれば、その場所と内容も表示される。元々は Unix 系のコマンド)と同じような機能のあるWindows用ソフトを知っている方がおりましたら教えてください。

  • unixでファイルの中身をコピーしたらサイズが変わりました・・・

    すいません。UNIX初心者です。 unixでAというファイルをcatコマンドで全部表示させ全コピーし 別のウィンドウにviで貼り付け、Bというファイルを作ったのですが 何故かファイルサイズが変わってしまいました。 cp -pでは変わらないのですが・・・ sdiffでAとBを比較したら何も差分はなかったのですが、 diffで比較すると一部を除いて差分が出てきたのですが、見た目どこに差分があるのかわかりません。スペースか何かか?と思ったのですが、肉眼で確認する限り違いがあるようには思えません。 unixの端末からftpでwindowsの端末にファイルを転送したときも同じようにファイルサイズが変わってしまいました。。。 二回目やったら何故かファイルサイズ変わらず成功しましたが。 すいません、考えられる可能性を教えていただけますでしょうか

  • テキスト比較コマンドのdiffについて

    unixコマンドにdiffというのがありますね。2つのテキストファイルを比較してその違いを出力するというものです。このコマンドの意味がわからないところがあります。 テキストAとBの比較とは、 1 両者が全く同じかどうかを比較するということなのか、 2 テキストAとBに含まれている各行を取り出してどこかに一致する行があるかどうかをチェックするということなのか 3 あるいはそれ以外の意味 どのようなことを意味するのでしょうか。 1だったら、1行付け加わっただけでそれ以降が同じものであったとしても全部検索対象となり出力されます。 2だったら、何をしたことになるのでしょうか。全く同じ内容で行構成を入れ替えたら検索に引っかからないことになります。 私の希望としては1なのですが、そうするとわけがわかなないぐらい多くの出力結果となることが多いはずです。オプションなどで対応するとは思いますが、基本的には何をするコマンドなのでしょうか。 よろしくお願いします。

  • (サーバ・UNIX)は、ひとつのディレクトリに何ファイルまでおいても良いですか?

    (サーバ・UNIX)は、ひとつのディレクトリに何ファイルまでおいても良いですか? 私は、Windowsしか使ったことが無いので、感覚というものが良く分からないのですが、 通常、Windowsの場合、1つのディレクトリに1000ファイル以上置くと動作が重くなります。 10000を超えるとパソコンがフリーズしてしまいます(Win98)。 そのため、1ディレクトリには1000程度にするよう、心がけています。 しかし、サーバの場合は、大抵、UNIXを使っているため、ファイル管理が非常に優秀だと聞きます。 ということは、1つのディレクトリにいくら置いても問題ないということでしょうか? レンタルサーバの空き容量がまだ、1900Mもあるため、CGIの練習も兼ねて、 時間列で、画像ファイル(ライブカメラ)をどんどん記録することを考えています。 たくさんのディレクトリを作って、時間や日付で分けることも考えたのですが、 ディレクトリ分けしても、しなくても呼び出し速度が殆ど換わらないのであれば、 1つのディレクトリにおきたいと思っています。 ファイル情報の取得など、1ディレクトリですととても簡単にできるので・・・ そして、容量が近くなったら、古いものから順番に削除していく。 or 日付の古いものを削除していく。 なお、転送容量にはは問題はなかったのですが、サーバに過度の負担をかけることは禁止でした。 ちなみに、呼び出す時は、そのディレクトリ中から画像を30枚ほどランダムに選んで表示する予定です。 画像のサイズは極小の2KB程度です。 以上の作成を考えております。そこで、長くなりましたが、ファイル管理についてご返答、 何卒、宜しくお願い致します。

  • 2つのサーバーのファイル比較

    2台のRedHadサーバーのファイルデータを比較して、 更新有り無しを調べたいのですが、「diff」コマンドでいいのでしょうか? AサーバーからBサーバーにデータを移した後に、AもしくはBサーバーにデータがアップデートされてしまう可能性があるので。 よろしくお願いします。

  • 特定の拡張子をもつファイルのみを比較

    UNIXでディレクトリAとBにある拡張子 .cblと .cpyのみをもつファイルを比較しようとしているのですが、どうすれば一番簡単にできますか? xargsを使うことになるとはおもうのですが、ファイルを指定するうまい方法が見つかりません。 よろしくお願いします。

  • UNIXのディレクトリ再起検索に関して。

    UNIXのディレクトリ再起検索に関して。 【内容】 ディレクトリの再起検索した内容をテキストに出力したいのですが、あるディレクトリの配下はテキストに出力したくないため、除外をしたいのですが、うまくいきません。 以下ディレクトリの構成は添付してあります。 たとえば、ls -laR > a.txtコマンドを実行して、1,2以外のディレクトリ(A,B,C)をa.txtに出力したいのです。 ご教示お願いします。

  • 簡単にファイルやディレクトリの存在を調べる方法(OSはSorarisです)

    c言語でファイルやディレクトリの存在を調べる方法ってどんなのがあります? 今は、以下のやり方でやろうとしています( ****=フルパスファイル名) p = popen( "ls ****, "r" ); fscanf( p, "%s", buf ); if( strcmp( buf, ****, ) == 0 )   ~~~~~~ また、unixでそういうコマンドってありますかね? ファイルが存在したら、1を返しなければ0を返すみたいなものとか

  • UNIXのディレクトリ「.」「..」について

    UNIXのディレクトリで、「.」とか「..」についてですが、これはどういう存在意義なんでしょうか? 少し調べたら、相対パス名の指定に必要ってかいてあったんですが、よくわかりません。よろしくお願いします。

  • ディレクトリとファイル

    UNIXではディレクトリもファイルの一種であるかのように扱われていますが、その利点は何でしょうか? lsコマンドで一括表示されることしか思いつきません。どなたかご教授お願いします。