SVNの使用に移る前は、/develop/
ディレクトリを保持し、そこでファイルを編集およびテストしてから、それらを/main/
ディレクトリに移動するだけでプロジェクトを管理していました。 SVNに移行することを決めたとき、ディレクトリが実際に同期していることを確認する必要がありました。
では、2つの異なるディレクトリにある同じ名前のファイルを再帰的に比較するシェルスクリプト[bash]を作成する良い方法は何でしょうか。
注:上記で使用されているディレクトリー名は、サンプルのみです。コードをトップレベルに保存することはお勧めしません:)。
Diffコマンドには、ディレクトリを再帰的に比較するための-rオプションがあります。
diff -r /develop /main
diff -rqu /develop /main
それはあなたにそのように変更の要約を与えるだけです:)
新規/欠落ファイルのみを表示したい場合
diff -rqu /develop /main | grep "^Only
それらをむき出しにしたい場合:
diff -rqu /develop /main | sed -rn "/^Only/s/^Only in (.+?): /\1/p"
私が利用できるdiffは、再帰的な違いを可能にします。
diff -r main develop
しかし、シェルスクリプトでは:
( cd main ; find . -type f -exec diff {} ../develop/{} ';' )
[私はどこかであなた自身の質問に答えることは大丈夫だと読んだので、ここに行きます:)]
私はこれを試しました、そしてそれはかなりうまくいきました
[/]$ cd /develop/
[/develop/]$ find | while read line; do diff -ruN "/main/$line" $line; done |less
上記の行を次のように編集することで、特定のファイルのみ(たとえば、.phpファイルのみ)を比較することを選択できます。
[/]$ cd /develop/
[/develop/]$ find -name "*.php" | while read line; do diff -ruN "/main/$line" $line; done |less
他のアイデアはありますか?
これは私の(やや厄介な)スクリプトの例です dircompare.sh 、これは:
diff -q
がそれらが異なるかどうかを判断するかどうかに応じて、2つの配列に再度ソートされます。diff
が等しいと主張するファイルについては、タイムスタンプを表示して比較しますそれがお役に立てば幸いです-乾杯!
EDIT2:(実際には、リモートファイルで正常に動作します-問題は、ローカルファイルとリモートファイル間の差分操作中に未処理のCtrl-Cシグナルでした。これには時間がかかる場合があります。スクリプトは、トラップで更新されました。それを処理します-ただし、参照用に以下の前の編集を残します):
編集:...リモートsshディレクトリ(~/.gvfs
で使用しようとした)のサーバーがクラッシュするように見えることを除いて...したがって、これはもうbash
ではありませんが、私が推測する代替手段はrsync
を使用するには、次の例を示します。
$ # get example revision 4527 as testdir1
$ svn co https://openbabel.svn.sf.net/svnroot/openbabel/openbabel/trunk/data@4527 testdir1
$ # get earlier example revision 2729 as testdir2
$ svn co https://openbabel.svn.sf.net/svnroot/openbabel/openbabel/trunk/data@2729 testdir2
$ # use rsync to generate a list
$ rsync -ivr --times --cvs-exclude --dry-run testdir1/ testdir2/
sending incremental file list
.d..t...... ./
>f.st...... CMakeLists.txt
>f.st...... MACCS.txt
>f..t...... SMARTS_InteLigand.txt
...
>f.st...... atomtyp.txt
>f+++++++++ babel_povray3.inc
>f.st...... bin2hex.pl
>f.st...... bondtyp.h
>f..t...... bondtyp.txt
...
ご了承ください:
rsync
のディレクトリ名の末尾にある末尾のスラッシュ/
を忘れないでください。--dry-run
-シミュレーションのみ、ファイルの更新/転送は行わない-r
-ディレクトリに再帰-v
-詳細(ただし、ファイルの変更情報に関連するnot)--cvs-exclude
-.svn
ファイルを無視します-i
- "-itemize-changes:すべての更新の変更の概要を出力します"man rsync
で示される情報(たとえば、上記の-i
文字列)を説明する>f.st......
の簡単な抜粋を次に示します。
The "%i" escape has a cryptic output that is 11 letters long.
The general format is like the string YXcstpoguax, where Y is
replaced by the type of update being done, X is replaced by the
file-type, and the other letters represent attributes that may
be output if they are being modified.
The update types that replace the Y are as follows:
o A < means that a file is being transferred to the remote
Host (sent).
o A > means that a file is being transferred to the local
Host (received).
o A c means that a local change/creation is occurring for
the item (such as the creation of a directory or the
changing of a symlink, etc.).
...
The file-types that replace the X are: f for a file, a d for a
directory, an L for a symlink, a D for a device, and a S for a
special file (e.g. named sockets and fifos).
The other letters in the string above are the actual letters
that will be output if the associated attribute for the item is
being updated or a "." for no change. Three exceptions to this
are: (1) a newly created item replaces each letter with a "+",
(2) an identical item replaces the dots with spaces, and (3) an
....
確かに少し不可解ですが、少なくともssh
に対する基本的なディレクトリ比較を示しています。乾杯!
古典的な(System V Unix)答えはdircmp dir1 dir2
、これはdir1ではあるがdir2ではない、またはdir2ではあるがdir1ではないファイルを最初に一覧表示するシェルスクリプトでした(出力の最初のページ、pr
コマンドから、見出しでページ付けされています)、続いて、各一般的なファイルを分析と比較します(同じ、異なる、ディレクトリが最も一般的な結果でした)。
これは消滅の過程にあるようです-あなたがそれを必要とするならば、私はそれの独立した再実装を利用できます。それはロケット科学ではありません(cmp
はあなたの友達です)。