새 파일과 이전 파일을 비교하여 다운로드한 파일이 중복되는지 확인하는 checkDuplicateDownload.sh라는 파일이 있다고 가정합니다.
이것이 제가하는 것입니다.
duplicate=`cmp $prevFile newFile -b`
는 duplicate
결과를 저장할 변수이고 cmp
, prevFile
는 이전 파일이고, newFile
는 새 파일입니다. 파일이 동일하면 값은 0 duplicate
이고 그렇지 않으면 1입니다.
위 명령 과 cmp
동일한 작업을 수행하되 awk를 사용하고 비교를 duplicate
변수에 저장하려면 어떻게 해야 합니까?
답변1
당신이 설명하는 것은 두 파일을 자동으로 비교하는 것 같습니다. 첫 번째 코드 조각은 종료 상태를 cmp
변수 에 넣습니다 duplicate
(0 = 일치, 그렇지 않으면 문제가 있습니다. man cmp
종료 상태 값에 대한 자세한 내용을 참조하세요).
cmp -s prevFile newFile
duplicate=$?
하지만 다음에 하고 싶은 일은 그 가치를 테스트 $duplicate
하고 이에 대한 작업을 수행하는 것일 것입니다. 이 경우 종료 cmp
값 을 직접 테스트할 수도 있습니다.
if cmp -s prevFile newFile
then
echo "Files match"
else
echo "Files do not match (or one is missing, unreadable, etc.)"
fi
변수를 사용하려는 경우 변수를 사용할 때 큰따옴표로 묶어야 한다는 것을 잊지 마십시오.
cmp -s "$prevFile" "$newFile"
$prevFile
또한 아직 존재하지 않는 것이 가능한지 고려하십시오 .
마지막으로, 어떻습니까 awk
? 작업에 적합한 도구가 아니므로 여기서는 사용하지 마십시오.
답변2
이것을 사용할 수 있습니다 awk
. 이렇게 하는 것은 별 의미가 없습니다. 파일 비교 를 위해 특별히 설계된 도구가 있습니다( diff
등 ). 반면에 임의의 작업에 사용할 수 있는 강력한 스크립트 언어입니다. 따라서 실제로 이러한 도구의 기존 기능을 에서 다시 구현할 수 있지만 다른 도구가 더 잘 수행하는 작업을 더 느리고 덜 효율적인 방식으로 수행하는 것 외에는 어떤 이점도 얻을 수 없습니다.cmp
md5sum
awk
awk
예를 들어, awk
프로그램은 두 파일이 동일한지 아니면 다른지 알려줍니다.
$ cat comp.awk
#!/usr/bin/awk -f
BEGIN{
differ=0
}
NR==FNR{
a[FNR]=$0;
last=FNR;
next
}
{
if(FNR>last || "x"$0"x" != "x"a[FNR]"x" ){
differ=1
exit;
}
}
END{
if(FNR<last){
differ=1
}
print differ
}
따라서 이것을 사용하여 비교를 변수에 저장할 수 있습니다.
duplicate=$(comp.awk prevFile newFile)
변수는 0
파일이 동일한지 1
다른지 여부입니다. 하지만 기존 도구를 사용하면 동일한 작업을 더 빠르고 효율적이며 더 안정적으로 수행할 수 있습니다.
duplicate=$(diff -q prevFile newFile)
물론 값은 단순한 1
OR 이 아니며 OR 또는 빈 문자열이 0
되지만 실제 차이는 없습니다. Files prevFile and newFile differ
아마도 후속 테스트 작업에서 이 변수를 사용하고 싶을 것이며 이를 완벽하게 수행할 수 있습니다.
$ [[ -z $duplicate ]] && echo differ || echo same
differ
따라서 이미 존재하는 것보다 더 느리고 오류가 발생하기 쉽고 더 번거로운 버전을 다시 만드는 것은 무의미해 보입니다.