파일 및 해당 속성 비교

파일 및 해당 속성 비교

매일 나는 다음과 같은 특정 파일 세트에 대한 정보를 메일로 받습니다.

58623208 Sep 14 20:08 blbn_blfbe_drv
57904920 Sep 14 19:54 blbn_cycmn
55814208 Sep 14 06:02 clsa_Upd
38912000 Sep 14 19:12 cs_chgpp
41107456 Sep 14 19:17 csmRFbe
39403520 Sep 14 19:09 csmUAddAct
39235584 Sep 14 19:20 csmUAddSub

...등, 약 60개의 파일이 있습니다.

이제 이 모든 파일을 기존 파일과 하나씩 비교하여 모두 일치하는지 확인해야 합니다.

filename, timestamp, datesize은 일치해야 합니다.

이것을 자동화할 수 있는 방법이 있나요?

comm또는 사용을 고려하고 있습니다 diff.

답변1

다음 -d옵션이 포함된 GNU Date가 있다고 가정합니다.

while read size mon day time filename; do
    if [[ ! -f "$filename" ]]; then
        echo "ERROR: no such file: $filename" >&2
    else
        filesize=$(stat -c %s "$filename")
        if [[ "$size" != "$filesize" ]]; then
            echo "ERROR: size mismatch: $filename" >&2
        else
            filetime=$(date -d "$(stat -c %y "$filename")" "+%b %d %H:%M")
            if [[ "$mon $day $time" != "$filetime" ]]; then
                echo "ERROR: date mismatch: $filename" >&2
            fi
        fi
    fi
done 

답변2

모든 새 파일이 new/에 있고(또는 이동할 수 있음) 모든 기존 파일이 old/ 디렉토리에 있다고 가정하면 'diff -ur old/new/'를 사용하여 디렉토리 간 파일의 차이점을 확인할 수 있습니다.

차이점의 본질에 관심이 없다면 단지 차이점만 있을 뿐입니다.사실일부 파일이 다른 경우 grep을 사용하여 출력을 필터링하세요. 하지만 diff의 종료 코드가 손실됩니다(1 = 차이점 발견). 대신 grep의 종료 코드를 사용할 수 있습니다(1 = 정규식 일치 항목이 없습니다. 이는 모든 파일이 동일하다는 의미로 해석할 수 있습니다).

예를 들어, 이전 텍스트 파일과 새 텍스트 파일(/bin, /sbin 및 /etc 디렉터리 목록이 포함된 쓰레기)을 생성했습니다. 그런 다음 new/baz를 편집하고 일부 줄을 삭제했습니다.

$ ls -l new old
new:
total 28
-rw-r--r-- 1 cas cas 11063 Sep 15 15:27 baz
-rw-r--r-- 1 cas cas 14529 Sep 15 15:25 foo

old:
total 20
-rw-r--r-- 1 cas cas  6843 Sep 15 15:24 bar
-rw-r--r-- 1 cas cas 12025 Sep 15 15:24 baz

먼저 두 디렉터리를 비교합니다.

$ diff -ur old new | egrep '^(Only|diff)'
Only in old: bar
diff -ur old/baz new/baz
Only in new: foo
$ echo $?
0

여기에서는 src 및 dst 디렉터리가 동일할 때(또는 내용이 정확히 동일할 때) 종료 코드를 볼 수 있습니다.

$ diff -ur old old | egrep '^(Only|diff)'
$ echo $?
1

cmp를 사용할 수도 있지만 단일 파일만 일치시킬 수 있으며 두 디렉터리 간의 차이점을 재귀적으로 확인할 수는 없습니다. 그 주위에 for 루프 래퍼를 작성해야 하며, 새 파일에만 존재하고 이전 파일에는 없는 파일을 고려해야 합니다. diff를 사용하기가 더 쉽습니다.

관련 정보