違い:ファイル名が少し​​ずつ異なる、同じファイル

違い:ファイル名が少し​​ずつ異なる、同じファイル

私はそれをdiff -rqMac OS X 10.6サーバーのディレクトリを比較するのに使います。フォルダ1には「ファイル名」があります。フォルダ2には、同期するファイルを保持するファイル同期アプリケーションによってフォルダ2が作成されたため、「filename.archive」があります。

バックアップからフォルダ1を抽出したところ、フォルダ2の内容が最新でコピーできることを確認したいと思います。

どうすればいいですか?具体的には、「file」が「file.archive」と同じように評価され、ファイル名ではなくファイルの内容やチェックサムで比較する方法を尋ねています。

答え1

diff両方のディレクトリのファイル名が一致せず、diffにマッピングを実行するために組み込まれていないため、「just」を使用してこれを行うことはできません。


あなたができることは、「新しい」ディレクトリに変更し、次のことを行います。

for i in *; do diff "$i" /path/to/other/dir/"$i"; done

または、復元されたバックアップディレクトリに変更して、次の手順を実行します。

for i in *.archive; do diff "$i" /path/to/new/dir/"${i%.archive}"; done

これが完全なディレクトリ構造に拡張されると、より複雑になります。元のファイルが下にある場合、aバックアップは下に一時的に復元されますbackup/b

.
├── a
│   ├── p
│   │   ├── x
│   │   ├── y
│   │   └── z
│   └── q
│       ├── 1
│       ├── 2
│       └── 3
└── backup
    └── b
        ├── p
        │   ├── x.archive
        │   ├── y.archive
        │   └── z.archive
        └── q
            ├── 1.archive
            ├── 2.archive
            └── 3.archive

次のスクリプトを実行できますpython toddiff.py a backup/b > todiff (todiffは上記のツリー構造にリストされていません)。

import sys
import os

base = sys.argv[1]
if base[-1] != '/':
    base += '/'  # this last / needs to be removed to create bup_file_name
backup = sys.argv[2]

for root, directory_names, file_names in os.walk(base):
    for file_name in file_names:
        full_name = os.path.join(root, file_name)
        bup_file_name = os.path.join(backup, full_name.replace(base, '', 1))
        bup_file_name += '.archive'
        # adjust the diff options to your need in the following line
        print('diff -u "{}" "{}"'.format(full_name, bup_file_name))

これにより、次の形式のファイルが生成されます。

diff -u "a/q/3" "backup/b/q/3.archive"
diff -u "a/q/1" "backup/b/q/1.archive"
diff -u "a/q/2" "backup/b/q/2.archive"
.
.

その後、次のように取得できます。source ./todiff

この場合、次のプログラムを実行することをお勧めします。

関連情報