매일 나는 다음과 같은 특정 파일 세트에 대한 정보를 메일로 받습니다.
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
, date
및 size
은 일치해야 합니다.
이것을 자동화할 수 있는 방법이 있나요?
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를 사용하기가 더 쉽습니다.