파일 복사본에 비해 파일 하드 링크의 장점

파일 복사본에 비해 파일 하드 링크의 장점

단일 인수를 허용하는 Bourne 쉘 스크립트가 있습니다(텍스트 파일 크기는 일반적으로 몇 KB입니다). 기본적으로 이 스크립트는 scp이 텍스트 파일을 원격 서버에 복사하는 래퍼입니다 . 스크립트는 scp원본 파일을 시도하지 않지만 파일의 하드 링크나 복사본을 생성합니다.

#!/bin/sh

TRANSFER_FILE=/var/tmp/acc_transfer_link_$$
INPUT_FILE=$1

#  Linking is always a better option, so try it first
ln $INPUT_FILE $TRANSFER_FILE 2>/dev/null

RC=$?
if [ $RC -ne 0 ]; then
  cp $INPUT_FILE $TRANSFER_FILE
fi

스크립트 작성자가 댓글을 남겼습니다.

링크는 항상 더 나은 옵션이므로 먼저 시도해 보세요.

왜 이런 일이 발생합니까? 하드 링크를 만드는 것보다 복사하는 데 시간이 조금 더 걸리기 때문인가요? 다른 이유가 있나요?

답변1

때에 따라 다르지.

링크를 설정하는 것이 데이터를 복사하는 것보다 빠르지만 결과 파일은 원본 파일과 동일한 내용을 가지며 수정 사항은 두 파일 모두에 표시됩니다. 이것이 장점인지 여부는 링크/카피를 만든 이유에 따라 다릅니다. 또한 하드 링크는 동일한 파일 시스템 내에서만 작동하므로 /var마운트/var/tmp 가 소스 디렉토리와 별개인 경우 링크가 작동하지 않습니다.


하지만 여기서 사용 사례가 무엇인지 알고 싶습니다. 스크립트의 목적이 에 있는 파일을 복사하는 것이라면 원본 파일에서 직접 실행 되지 않고 $1복사되는 이유는 무엇입니까 ? 먼저 로컬 복사는 복사 프로세스 중에 소스 파일이 수정되었을 수 있고 파일을 일관성 없는 상태로 복사해서는 안 된다고 가정할 이유가 있는 경우에만 필요합니다. 그러나 여기에는 접근 방식에 몇 가지 문제가 있습니다.$TRANSFER_FILEscp

1) 로컬 복사본을 만드는 것도 cp같은 문제가 있습니다. 로컬 복사본을 만드는 동안 소스가 수정될 수도 있습니다. 2) 링크 ln는 즉각적이지만 하드 링크는 원본과 동일한 데이터를 가리키므로 링크 이전에 파일을 열었던 모든 프로세스는 계속해서 데이터를 수정할 수 있습니다.

링크한 후(유사한 방법을 사용하여) 파일이 다른 프로세스에서 열리지 않도록 하거나 lsof, 일부 애플리케이션별 방법을 통해 복사본을 만들고 데이터의 일관성을 확인해야 합니다. 둘 다 그다지 간단하지 않기 때문에 원자적 수정을 수행하는 일반적인 방법은 파일의 새 복사본을 작성한 다음 이름을 이전 복사본으로 바꾸는 것입니다. 이렇게 하면 이름을 바꾸기 전에 파일을 연 프로세스는 이전 버전을 얻게 되고, 이름을 바꾼 후에 파일을 연 프로세스는 새 버전을 갖게 됩니다. 그러나 어느 쪽도 불완전한 사본을 볼 수는 없습니다. 단, 이는 파일을 읽는 프로그램에서가 아닌 파일을 수정할 때 이루어져야 합니다.

관련 정보