作成したい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 bar
2つのファイルの行のみを表示し、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