11

Linux Mint 12 で Gnome を使用して、約 9.7 GB のフォルダー (サブフォルダーの複雑なツリーを含む) をある NTFS フラッシュ ドライブから別の NTFS フラッシュ ドライブにコピーしました。Gnome によるとファイル数は一致しますが、du (および他のプログラム) によるとバイト数は一致しません。(他の Linux ディストリビューションや Windows XP でフォルダーをコピーするときに同じ問題が発生しました。)

バイト数が一致しないファイルを知りたいだけです。(時間がかかりすぎるため、各ファイルの内容を比較したくありません。) バイト数が一致しないファイルを見つけるための、最も簡単で最速の方法は何ですか?

4

3 に答える 3

10

ファイル名のスペースの処理に問題があるため、@ user1464130 による回答を適応させます。

cd dir1
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt
cd dir2
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

while各ファイルに対してコマンドを起動し、その結果をレポートで使用する場合は、 Bash 構造を使用できます。この例ではmd5sum、各ファイルのチェックサムを計算するために使用します。

find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done

それぞれ$()が個別に実行され、各ファイルのチェックサムを計算できます。を使用するとtr、連続するすべてのスペースが 1 つのスペースに絞り込まcutれ、n 番目の位置、ここでは最初の位置にある単語が抽出されます。そうしないと、ファイルの名前が 2 回取得md5sumされます。これは、標準出力に戻すためです。

以下は、比較を使用しない例です (no diff)。-各ファイルについて出力する 3 つのデータを強調するためにダッシュを使用しましたが、それを別のプログラムにフィードする場合は問題になる可能性があることに注意してください。

$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" |  while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413

編集:ファイル名のスペースを処理し、チェックサムとサイズを取得するには、次のコードを使用できます。

$ find . -maxdepth 1 -name "*.c" -type f -print0 | xargs -0 -n 1 md5sum | while read checksum path; do echo $path $(stat --printf="%s" "$path") $checksum ; done
./ini tia li za tion.c 84 31626123e9056bac2e96b472bd62f309
于 2015-03-07T14:45:04.650 に答える
6

両方のパーティションが同じ属性を持っているかどうかを確認しましたか? (ブロックサイズ、サイズ、削除または不良ブロック用の予約スペースなど)

特定のケースでは、オプション -n (または --dry-run) を指定したrsyncをお勧めします。どのファイルが異なるかがわかります。あれは:

$ rsync -I -n /source/ /target/

オプション-Iは、時間を無視することです。同じコマンドを使用して、両方のディレクトリを同等にすることができます (タイムスタンプ、権限など)。

rsyncのマニュアルを確認するか、オプション--helpを試して、より多くのオプションと使用方法の例を取得してください。とてもパワフルです。

于 2012-06-24T22:16:01.797 に答える
3

dir1とdir2を比較する必要があると仮定して、コンソールコマンドを次に示します。

cd dir1
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir1.txt
cd dir2
find . -type f|sort|xargs ls -l| awk '{print $5,$8}' > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt

ファイルの長さとパスを正しく出力するために、awkパラメーターを編集する必要がある場合があります。

于 2012-06-18T17:10:54.710 に答える