4

私は明らかに単純に何かが欠けています。問題は、空白の出力を作成しているため、比較できないことです。ただし、誰かがこれに光を当てることができれば、それは素晴らしいことです-私はそれを分離していません.

md5sum最終的に、txtファイルに保存されたリストとサーバーに保存されたリストを比較しようとしています。エラーが発生した場合は、それを報告する必要があります。出力は次のとおりです。

root@vps [~/testinggrounds]# cat md5.txt | while read a b; do
>   md5sum "$b" | read c d
>   if [ "$a" != "$c" ] ; then
>     echo "md5 of file $b does not match"
>   fi
> done
md5 of file file1 does not match
md5 of file file2 does not match

root@vps [~/testinggrounds]# md5sum file*
2a53da1a6fbfc0bafdd96b0a2ea29515  file1
bcb35cddc47f3df844ff26e9e2167c96  file2

root@vps [~/testinggrounds]# cat md5.txt
2a53da1a6fbfc0bafdd96b0a2ea29515  file1
bcb35cddc47f3df844ff26e9e2167c96  file2
4

3 に答える 3

7

あなたの質問に直接答えるのではなく、md5sum(1) :

-c, --check
read MD5 sums from the FILEs and check them

お気に入り:

$ ls
1.txt  2.txt  md5.txt
$ cat md5.txt
d3b07384d113edec49eaa6238ad5ff00  1.txt
c157a79031e1c40f85931829bc5fc552  2.txt
$ md5sum -c md5.txt
1.txt: OK
2.txt: OK
于 2012-09-13T19:27:21.903 に答える
4

あなたが抱えている問題は、内部読み取りがサブシェルで実行されることです。bash では、コマンドをパイプするとサブシェルが作成されます。サブシェルが終了すると、変数 $c と $d はなくなります。プロセス置換を使用して、サブシェルを回避できます。

while read -r -u3 sum filename; do
   read -r cursum _ < <(md5sum "$filename")
   if [[ $sum != $cursum ]]; then
      printf 'md5 of file %s does not match\n' "$filename"
   fi
done 3<md5.txt

リダイレクト3<md5.txtにより、ファイルはファイル記述子 3 として開かれます。-u 3オプションreadにより、そのファイル記述子から読み取られます。内部readは引き続き標準入力から読み取ります。

于 2012-09-13T19:23:37.817 に答える
3

私は議論するつもりはありません。ループ内からの二重読み取りを避けるようにしています。

#! /bin/bash

cat md5.txt | while read sum file
do
    prev_sum=$(md5sum $file | awk '{print $1}')
    if [ "$sum" != "$prev_sum" ]
    then
        echo "md5 of file $file does not match"
    else
        echo "$file is fine"
    fi
done
于 2012-09-13T21:14:45.210 に答える