web-dev-qa-db-ja.com

同じディレクトリ内の同じファイルに対して異なるMD5Sum

同じディレクトリからまったく同じファイルを使用して異なるmd5sumを取得できたので、奇妙だと思います。以下のような出力:

[root@testlabs Config]# ls  
Backup_Files  
hostname1-config.uac  
hostname2-config.uac  
hostname3-config.uac  
[root@testlabs Config]# ls hostname1-config.uac | md5sum  
2a52f0eb11f6478a4f8aeee1c0ac90dd  -      
[root@testlabs Config]# md5sum hostname1-config.uac  
d41d8cd98f00b204e9800998ecf8427e  hostname1-config.uac  

正しいmd5sumの結果を取得する正しい方法を教えてください。ありがとうございました。

これは、2つのファイル(元のファイルとバックアップコピーファイル)のMD5を比較するために行いました。元のファイルの命名規則はhostname1-config.uacですが、バックアップファイルはhostname1-201411071649.uacです。しかし、それらは単なるコピーです(cp -p)。

最初の方法

(動作しません)

 #!/bin/bash
 # ...
 #
 ls hostname1-config.uac | md5sum hostname1-config.uac > /tmp/md5sum.tmp
 ARCHIVE_DIR="/tmp/Archive"
 FULL_HOSTNAME=`/bin/sort -d /tmp/full_hostname.tmp`
 TIMESTAMP=`/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME`

 for HOSTNAME in `/bin/sort -d /tmp/hostname.tmp`
 do
     ls $ARCHIVE_DIR | grep -i --text $HOSTNAME-$TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp
 done

2番目の方法

(コマンドラインでは完全に機能しましたが、スクリプトでは機能しませんでした)

コマンドラインで

[root@testlabs Config]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Config]# md5sum hostname1-config.uac > md5.tmp
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Archive]# echo 'Tampered!' > hostname1-config.uac
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -     c /Network_Backup/Config/md5.tmp
hostname1-config.uac: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@testlabs Archive]# rm -f hostname1-config.uac
[root@testlabs Archive]# cd /tmp/Config
[root@testlabs Config]# cp -p hostname1-config.uac /tmp/Archive
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -c /Network_Backup/Config/md5.tmp
hostname1-config.uac: OK

スクリプト内

#!/bin/bash
# ...
#
CONFIG_DIR="/tmp/Config"
ARCHIVE_DIR="/tmp/Archive"
HOSTNAME=`/bin/sort -d /tmp/hostname.tmp`
FULL_HOSTNAME=`/bin/sort -d /tmp/full_hostname.tmp`
TIMESTAMP=`/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME`

cd $CONFIG_DIR
md5sum $FULL_HOSTNAME > /tmp/md5sum.tmp
cd $ARCHIVE_DIR
cat $HOSTNAME-$FILE_TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp

/tmp/md5sum2.tmpに返される結果:
hostname1-config.uac:オープンまたは読み取りに失敗しました

2
Win.T

Md5チェックサムファイル(この場合はmd5sum.tmp)で指定されたファイルが存在しない場合、応答FAILED open orreadが発生します。

例えば。

[user@localhost tmp]$ cd /tmp/testfolder
[user@localhost testfolder]$ touch dog
[user@localhost testfolder]$ md5sum dog > /tmp/md5sum.tmp
[user@localhost testfolder]$ md5sum -c /tmp/md5sum.tmp
dog: OK
[user@localhost testfolder]$ cd ..
[user@localhost tmp]$ md5sum -c /tmp/md5sum.tmp
md5sum: dog: No such file or directory
dog: FAILED open or read
md5sum: WARNING: 1 listed file could not be read

-cオプションを渡した場合、md5sumプログラムは標準入力を参照しないことに注意してください。 -cオプションで指定されたファイルのチェックサムを確認するだけです。それらが存在し、ファイル名が一致する場合、それを比較してすべてが満足します。

おそらくより良い方法がありますが、2つの別々のmd5sumの結果を変数に格納し、それらをifステートメントと比較することがおそらく私が採用するアプローチです。

こんな感じ。

#!/bin/bash
firstfile=`cat dog | md5sum `
# alternately could have used firstfile=$(md5sum < dog ) to ovoid UUOC
secondfile=`cat mouse | md5sum `
if [ "$firstfile" == "$secondfile" ]; then
    echo "They Match!"
else
    echo "They Don't Match!"
fi
2
R Schultz

後者。 ls file | md5sumを実行すると、ファイルの内容ではなく、文字列file\nのmd5sumを取得します。

原則として、あなたは決してls file | commandでファイルを渡しますが、それがあなたが望むことをするケースはほとんどありません。コマンドにファイル名を付けて、そのファイルで何かを実行することを期待する場合は、引数として指定します。

command file

したがって、md5sumの場合は、実行する必要があります

$ md5sum hostname1-config.uac
3
terdon