Сгенерируйте сумму MD5 для всех файлов в каталоге и получите их совпадения в другом каталоге. - PullRequest
0 голосов
/ 10 октября 2018

У меня есть 2 каталога.livedir содержит 2000 файлов fmx, а testdir содержит 6000 фмб с прикрепленными временными метками.Я скомпилировал все fmb в testdir в fmx, чтобы сопоставить их с fmx в livedir.

. Я создал следующий скрипт для получения MD5SUM всех файлов в livedir и поиска, если они существуют в testdir:

testdir='/home/oracle/ideatest/test/'
livedir='/home/oracle/ideatest/live/'
cd /home/oracle/ideatest/live/

for f in *; do
    livefile=$(md5sum "$f" | cut -d" " -f1)
    sourcefile=$(md5sum "$testdir""$f" | cut -d" " -f1)
    if [[ -f $f ]] && [ $livefile == $sourcefile ]; then
        echo "$f" "OK-----------------------------"
        echo "$sourcefilename"
        cp /home/oracle/bankplus/ideatest/test/$f  /home/oracle/bankplus/ideatest/live2/$f
        #el moshkla f 2sm el file 3ayzo mn 3'er hash
    else
        echo "$f" "MODIFIED"
    fi
done

Сценарий работает только в том случае, если в двух каталогах существует файл с одинаковым именем.Это потому, что я зацикливаюсь, используя одно и то же имя $f:

sourcefile=$(md5sum "$testdir""$f" | cut -d" " -f1)

В результате cp копирует только один файл, хотя у меня есть несколько файлов с одинаковым значением хеш-функции в testdir.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я получил это с помощью

testdir='/home/oracle/ideatest/test/'
livedir='/home/oracle/ideatest/live/'
cd /home/oracle/bankplus/ideatest/live/
        for f in *;
                 do
                        livefile=$(md5sum "$f" | cut -d" " -f1)
        for l in "$testdir"*
                 do
                        sourcefile=$(md5sum "$l" | cut -d" " -f1)
         done
                        [[ -f $f ]] && if [ $livefile == $sourcefile ]
                 then
                         echo "$f" "Found a HASH Match Copied to live2-";
                         cp $l  /home/oracle/ideatest/live2/
                 else
                         echo "$f" "MODIFIED";
                         fi;
         done
0 голосов
/ 10 октября 2018

Если ваш bash verion 4.2 или более поздний, как насчет использования ассоциативного массива:

#!/bin/bash

testdir="/home/oracle/ideatest/test"
livedir="/home/oracle/ideatest/live"

declare -A hash

# 1st step: create a hash table of md5sum in $testdir
for f in $(find "$testdir" -type f); do
    md5sum=$(md5sum "$f" | cut -d" " -f1)
    hash[$md5sum]=${f##*/}  # holds md5sum as a key and filename as a value
done

# 2nd step: loop over files in $livedir and test if md5sum value of a file
# exists in $testdir
for f in $(find "$livedir" -type f); do
    basename=${f##*/}
    md5sum=$(md5sum "$f" | cut -d" " -f1)
    if [[ -n "${hash[$md5sum]}" ]]; then
        echo "$basename" "OK-----------------------------"
        echo "${hash[$md5sum]}"
        cp "/home/oracle/bankplus/ideatest/test/$basename" "/home/oracle/bankplus/ideatest/live2/$basename"
    else
        echo "$basename" "MODIFIED"
    fi
done

Надеюсь, это поможет.

...