プロが教える店舗&オフィスのセキュリティ対策術

やりたいこと自体は単純なことなのですが・・

UNIXのコマンドで、
2つのディレクトリA、Bを比較して、
Aだけにあるディレクトリ・ファイルのみを取得できるようなものを教えてください。
(ファイルが同一かどうかは問題ではなくて、あくまでも存在不存在の比較です。)

コマンドを組み合わせたり、オプションを使ってもかまいません。

diffコマンドってこういうとき使えないのでしょうか。

A 回答 (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だけにあるファイル)
でどうでしょうか?
    • good
    • 6

シェルスクリプトの中で使うなら



for name in `cd A ; find . -type f`
do if [ ! -e B/$name ]
then echo $name
fi
done

みたいなのもありかも。
find でAの下のファイルを捜し出して、
if でBの下に有るかどうか調べて
無ければ それなりの処理(上記では echo )をする
    • good
    • 3

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

diff A B | grep ^A



ってのはダメなんでしょうか?もし純粋にファイル名だけをストリングとして欲しいなら、

diff A B | grep ^A | perl5 -e 'while(<STDIN>) { print "$2\n" if ($_ =~ /^([^:]*): (.*)/);}"

…ダメでしょうか?
    • good
    • 0

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

一回だけ調べたいだけなら例えば


ls -l `ls ../A`
みたいな感じでどうですか。

この回答への補足

ご回答ありがとうございます。

おっしゃっているのは、

Bディレクトリに行き、
ls `ls ../A`
で、Aディレクトリにのみ存在するものが、
「No such file or directory」
と表示される

という意味だと思います。

質問に書いてないので申し訳ないのですが、
Aディレクトリの下にフォルダがあって、その中にファイルがあるというような深い階層も比較しようと考えています。

ls `ls ../A`
だと深い階層のファイルは比較できないようです。

lsを使うとすれば -R オプションが関係ありそうだ、という感じはするのですが、
具体的にどうすればよいのかわかりません。

単純なことだと思っているので、複雑にしたくないと思っています。
尚、シェルスクリプトの中で使います。

補足日時:2005/06/24 17:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!