web-dev-qa-db-ja.com

'md5sum-c'の使用の難しさ

コピーされたファイルを確認するためにmd5sumを使用するのに問題があります。

dir1dir2の2つのディレクトリがあります。 dir1には、file1file2file3file4、およびfile5の5つのファイルがあります。 dir2は空です。

私がそうする場合:cp dir1/* dir2

次に:md5sum dir1/* > checksums

次に:md5sum -c checksums

結果は次のとおりです。

dir1/file1: OK
dir1/file2: OK
dir1/file3: OK
dir1/file4: OK
dir1/file5: OK

しかし、これは良くありません。テキストファイルのチェックサムをdir2のコピーされたファイルのチェックサムと比較したいと思います。

1
EmmaV

試してみてください:

$ (cd dir1 && md5sum *) > checksums
$ cd dir2
$ md5sum -c ../checksums

checksumsのコンテンツは次のようになります。

d41d8cd98f00b204e9800998ecf8427e  file1
................................  file2
................................  file3
................................  file4
................................  file5
3
yaegashi

最も基本的な操作形式では、実行から作成されたチェックサムファイルを1つコピーします。

md5sum Dir1/* 

実行したコピーの有効性をテストするディレクトリに移動します。 (バックアップなどで他のファイルもコピーしながらこれを行う場合は、次のように個別に行う必要はありません:)

cp checksum Dir2/checksum
cd Dir2

2番目のディレクトリに変更すると、コマンドの実行が簡単になります。不足しているファイルを処理する必要がある場合は、ターミナルで機能するファイル(およびコマンドの履歴)への適切なパスを確保するのに役立ちます。それ以外の場合は、コピーして後でコマンドラインに貼り付けます。

md5sum -c checksum 

コピーされたものの整合性を提供します。

0

これを試すことができます

#Create your md5 file based on a path - recursively
pathtocheck=INSERTYOURPATHHERE
find $pathtocheck -type f -print0 | xargs -0 md5sum >> xdirfiles.md5

#Compare All Files
md5results=$(md5sum -c xdirfiles.md5)

#Find files failing Integrity Check
echo "$md5results" | grep -v OK

#Count the files good or bad.
lines=0
goodfiles=0
badfiles=0
while read -r line;
do
  lines=$(($lines + 1))
  if [[ $line == *"OK"* ]]; then
    goodfiles=$(($goodfiles + 1))
  else
    badfiles=$(($badfiles + 1))
  fi
done <<< "$md5results"
echo "Total Files:$lines Good:$goodfiles - Bad: $badfiles"

それはあなた自身の遊びのためです... dir2をチェックさせる方法についてのあなたの質問に直接答えるために... sedのある各ファイルの前に/ dir2 /を強制するだけです。ファイルをチェックするための絶対パスを提供します。

sed -I "s/  /  \/dir2\//g" xdirfiles.md5

[root@server testdir]# md5sum somefile
d41d8cd98f00b204e9800998ecf8427e  somefile
[root@server testdir]# md5sum somefile > somefile.md5
[root@server testdir]# sed -i "s/  /  \/dir2\//g" somefile.md5
d41d8cd98f00b204e9800998ecf8427e  /dir2/somefile

使用したsedコマンドの内訳

sed -i <- Inline replacement.
s/ <- Means to substitute. (s/thingtoreplace/replacewiththis/1)
"  " <- represented a double space search.
/ <- to begin the Replacement String values
"  \/dir2\/" <-  Double Spaces and \ for escape characters to use /. The
final /g means global replacement or ALL occurrences. 
/g <- Means to replace globally - All findings in the file. In this case, the md5 checksum file seperates the hashes with filenames using a doublespace. If you used /# as a number you would only replace the number of occurrences specified.
0
Steve Kline