ディレクトリ1のファイルを比較し、ディレクトリ2のファイルを比較しませんか?

ディレクトリ1のファイルを比較し、ディレクトリ2のファイルを比較しませんか?

作成したいbashスクリプトの作成に問題があります。

lsがディレクトリ内のファイルを一覧表示していることを知っていますが、ディレクトリ1にはディレクトリが一覧表示されますが、ディレクトリ2には表示されていない次のディレクトリ1にはないディレクトリ2のファイルが一覧表示されます。

私は弱い試みで以下を試しました。

ls -al | diff directory1 directory2

なぜそれがうまくいかないのかを理解するには長い時間がかかりませんでした。誰でも完全なオタクを助けることができますか?

答え1

bashを考えると、おそらくこれが最も簡単でしょう。

$ comm <(ls -a dir1) <(ls -a dir2)

式の<(command)実行注文する参照をパイプして交換します/dev/fd

mress:10018 Z$ echo <(ls)
/dev/fd/11

したがって、上記のコマンドはls -a各ディレクトリで実行され、その出力をファイル引数として提供し、comm最大3つの列を出力してタブをインデントします。最初のディレクトリのエントリのみ、両方のディレクトリのエントリ、および両方のディレクトリのエントリです。 (つまり、両方のファイルに存在する場合は1つのタブをインデントし、2番目のファイルにのみ存在する場合は2つのタブをインデントします)。 comm -1 foo bar2つのファイルの行のみを表示し、2番目のファイルの行のみを表示します。ファイル、後者は次にインデントされます一つブランド。 (最も一般的な方法は、必須列を除くすべての列を表示しないことです。 comm -13 foo bar一般的な行のみが表示されます。)

最初のディレクトリの内容が欲しいと仮定すると、これは次のことを意味します。

$ comm -23 <(ls -a dir1) <(ls -a dir2)

存在以上のものが必要な場合は、diff -r以下を使用してください。

答え2

これは純粋なスクリプトです。以下はディレクトリaとbです。

find a b
a
a/a
a/b
a/c
a/f
a/f/h
a/f/i
b
b/b
b/c
b/d
b/f
b/f/g
b/f/h

これはコマンドです:

cd a
find ./ -exec test ! -e ../b/{} ";" -print 

出力:

./a
./f/i

aとbを交換してaではファイルを取得しますが、bでは取得しません。これ!いいえです。 -e テスト - 存在します。 Prosa で: "../b の a で見つかったファイルが存在しないかテストします。"

注:「a」を持たない名前を取得するには、まず詳しく調べる必要があります。 2番目の比較にはcdが必要です../b

答え3

グラフィックツールを好む場合は、次を使用します。

xxdiff dir1 dir2 

まずインストールする必要があります。同様のプログラムがあります。

gtkdiff
tkdiff

Midnight Commanderには、compare directoriesサブディレクトリを使用しない場合でも効果的に機能するコマンドが組み込まれています。

答え4

この問題を解決するには、findおよびを使用できます。awk

次のレイアウトを使用します。

$ mkdir a b a/1 b/1 b/2 a/3
$ touch a/f1 b/f1 a/f2 b/f3

最初の部分:

$ find a b -mindepth 1 -maxdepth 1 -type d | \
    awk -F/ ' { if (!w[$1]) w[$1]=++i; if (w[$1]>1) b[$2]=1; else a[$2]=1; }
          END { for (x in a) if (!b[x]) print x }'
3

2番目の部分:

$ find b a -mindepth 1 -maxdepth 1 -type f | \
    awk -F/ ' { if (!w[$1]) w[$1]=++i; if (w[$1]>1) b[$2]=1; else a[$2]=1; }
          END { for (x in a) if (!b[x]) print x }'
f3

これを次の解決策とcomm比較してください。

$ comm -23 <(ls a) <(ls b)    
3
f2
$ comm -13 <(ls a) <(ls b)
2
f3

そしてjoin解決を提供します:

$ join -v1 <(ls a) <(ls b)
3
f2
$ join -v2 <(ls a) <(ls b)
2
f3

関連情報