2012-01-11 5 views
2

내 bash 스크립트는 일부 파일을 여러 개의 디렉토리에 복사합니다.Bash : 대상이 같은 볼륨 안에 있으면 하드 링크를 만듭니다. 복사하지 않을 경우 복사하십시오.

공간을 절약하고 속도를 극대화하려면 모든 사본이 평생 동안 똑같이 유지되어야하므로 사본 대신 하드 링크를 만드는 것이 좋습니다.

스크립트는 다른 컴퓨터에서 실행되지만 대상 디렉터리가 원본과 다른 볼륨에있는 경우가있을 수 있습니다. 이 경우 하드 링크를 만들 수 없으며 파일을 복사해야합니다.

원본 볼륨과 대상 디렉터리가 같은 볼륨에 있는지 확인하여 하드 링크 또는 복사 할 수 있도록하려면 어떻게합니까?

ln $SRC $TARGET || cp $SRC $TARGET 

답변

0

쉬운 방법은, ln 여부를 확인하여 실패 참조 사본 (하드 링크 된 파일만큼 가볍지만 두 개의 사본을 나중에 편집/발산 할 수 있음)은 작동 할 수 있습니다.

cp --reflink=auto "$FROM" "$TO" 

, 당신은 stat를 사용하여 장치의 파일 시스템의 장치 ID를 얻을 수 있습니다

if [ $(stat -c %D "$FROM") = $(stat -c %D "$TARGET_DIR") ]; then 
      ln "$FROM" "$TARGET_DIR"/ 
    else 
      cp "$FROM" "$TARGET_DIR"/ 
    fi 
+0

는 CP 그냥 크로스 장치를 실패 -l하지 않을까요? 또한, 하드 링크는 '모든'메타 데이터를 유지하기 때문에, 첫 번째 변종에서'cp -al' (또는 첫 번째 변종에서'cp -a')를 제안합니다 : – sehe

+0

@sehe :'cp -l' 실패는 두 번째 생각이었습니다. . 그래서 좋은 대안이 아니라 힌트를 주셔서 감사합니다. – thiton

3

그렇게하는 간단한 방법, 그냥 모두 시도하는 것입니다 :

ln "$FROM" "$TO" || cp "$FROM" "$TO" 

를 당신의 목적에 따라 만들어 cp 성공 곳

+0

첫 번째 옵션이 가장 좋은 것 같습니다 (오류가 발생하면 오류 메시지가 조금 나 빠지기는하지만). 다른 두 가지 솔루션은 크로스 플래트 즘 문제가 있습니다 (Mac OS X에서 시도해 보았습니다. 리피 링크를 지원하지 않는 것으로 보입니다. BSD에서 가져온'stat' 명령은'-c' 매개 변수도 허용하지 않습니다). – elmimmo