ファイル内のデータを実際に比較せずに2つのディレクトリ構造を比較するための最良かつ最も簡単な方法は何ですか?これはうまくいきます:
diff -qr dir1 dir2_
しかし、ファイルも比較しているため、本当に遅いです。これを行うためのdiffまたは別のシンプルなcliツールのスイッチはありますか?
-type d
、@ slartibartfastの回答からオプションを削除するか、私の回答を確認してください。
ファイル内のデータを実際に比較せずに2つのディレクトリ構造を比較するための最良かつ最も簡単な方法は何ですか?これはうまくいきます:
diff -qr dir1 dir2_
しかし、ファイルも比較しているため、本当に遅いです。これを行うためのdiffまたは別のシンプルなcliツールのスイッチはありますか?
-type d
、@ slartibartfastの回答からオプションを削除するか、私の回答を確認してください。
回答:
次のコマンド(最初のディレクトリをdirectory1に、2番目のディレクトリをdirectory2に置き換えた場合)は、探していることを迅速に実行するはずです。
find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1
基本的な原則は、ベースdirectoryNディレクトリを基準としたサブディレクトリパスを含むすべてのディレクトリを出力することです。
ディレクトリ名の一部にキャリッジリターンがあり、他のディレクトリ名にはない場合、これは落ちる可能性があります(奇妙な出力を生成します)。
diff -rq
ますが、ルートディレクトリが1つに存在することを示し、続行します。
私は通常rsync
このタスクに使用します:
rsync -nav --delete DIR1/ DIR2
常に-n
aka--dry-run
、オプションを使用する場合は注意が必要です。そうしないと、ディレクトリの同期(内容の変更)が行われます。
これは、ファイルの変更時間とサイズに基づいてファイルを比較します...それが本当に必要なものだと思いますか、少なくともそれを行う場合は気にしませんか?ファイルの内容の違いを無視するためにそれを必要とするのではなく、それをもっと速くしたいという感覚がありました。同じ名前の異なるファイルをリストしないようにする場合は、--ignore-existing
オプションを追加するとそれができると思います。
また/
、末尾にa を付けないDIR1
と、ディレクトリ DIR1
との内容が比較されることに注意してくださいDIR2
。
出力はやや冗長になりますが、どのファイル/ディレクトリが異なるかを示します。ファイル/ディレクトリに存在するものDIR2
と存在しないもののDIR1
前には、単語が付きdeleting
ます。
状況によっては、@ slartibartfastの答えがより適切かもしれませんが、-type d
ディレクトリ以外のファイルのリストを有効にするオプションを削除する必要があります。 rsync
比較するファイル/ディレクトリの数が多い場合は高速になります。
deleting...
テキストに気付くことは困難ですが、おそらく速度を維持しながらファイルを比較するための優れた方法の1つです。ここでのその他の回答は、OPの例のようにファイルの差分が必要ない場合は高速ですが、私はこれが本当に好きです。
sudo -u nobody rsync -nav --delete d1 d2
「他人のためのフラグが読み取りを許可することを条件とします。
lsの回答に似ていますが、ツリーをインストールすると、次のことができます。
tree dir1 > out1
tree dir2 > out2
diff out1 out2
diff <( tree dir1 ) <( tree dir2 )
i
フラグを付けてツリーを実行することをお勧めします。このフラグでは、ツリーの線(tree -i dir1
など)は出力されません。ディレクトリ構造が1か所で異なる場合、一致する他のファイル|
のツリー出力に含まれるシンボルの数が増減する可能性があり、ファイルパスが同じでもdiffはそれらの行をキャッチします。
この問題の解決策を探していました。私が一番気に入った解決策は次のとおりです。
comm <(ls DIR1) <(ls DIR2)
1-DIR1のみのファイル、2-DIR2のみのファイル、3-DIR3のみのファイル詳細については、このブログ投稿をご覧ください。
DIR3
指定されていますか?私が見るのはDIR1
とだけDIR2
です。
DIR1
で列1、のみ内のすべてのファイルDIR2
で列2、およびすべてのファイルの両方で共有して、カラム3。それは一種の有用ですが、列3を取り除き、違いだけを残す方法を知っていますか?私が持っている多くてソートするファイルのを、そのほとんどは同じです。同じものを見る必要はありません。
comm <(ls DIR1) <(ls DIR2)
再帰的に機能しないことがわかりました。そのために使用しましたcomm <(ls -R1 DIR1) <(ls -R1 DIR2)
。ls -R
ディレクトリを再帰的にクロールし、ls -1
(これはLではなく1であることに注意してください)1行につき1つのファイル名のみを印刷します。ls
comm -3
参照man comm
)。
rsyncのみがユーザーフルだと思います。どうして?
diffは、ファイルとディレクトリを保持する構造にのみ役立ちます。Diffは、シンボリックリンクを使用するときに適切な終了コードを提供しません。その場合、srcとdstが同一(時間、サイズ、名前、タイムスタンプ、ポインティングソフトリンクなど)であっても、diffは2つの終了コードを返すことができます。
dir、srcとdstのディレクトリの内容が同一であっても、ファイルシステムはファイルの順序を保証しません。たぶん、あなたはそれをソートすることによってls出力をフィルタリングする必要があります。ただし、純粋なlsはノード名のみを表示します。
ノードタイプのdiff、cmp、test -Xを含むスクリプトは便利かもしれませんが、多くのtest / cmpの実行によって生じる過負荷について覚えておいてください。スクリプトは非常に遅くなります。
いつものように、「dirs is / is n't同一」という簡単な情報を取得したい場合は、-n(dry)オプションを指定してrsyncを使用する必要があります。違いを見つけたい場合は、diffコマンドを使用します。