하드 링크된 파일의 링크를 해제하는 가장 좋은 방법은 무엇입니까?

하드 링크된 파일의 링크를 해제하는 가장 좋은 방법은 무엇입니까?

을 사용하여 rdfind하드 링크된 파일(~60-90)을 많이 찾았으며 모든 파일의 링크를 해제하고 싶습니다. 가능한 해결책 중 하나는 모든 파일을 찾아서 -link +1 복사하고 삭제한 다음 다시 링크 이름으로 옮기는 것입니다.

더 나은 해결책이 있습니까? 이 작업을 수행하는 더 쉬운 방법이 있나요?

답변1

넌 할 수있어:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cat > "$1"; } < "$1"' sh {} \;

하지만 파일 메타데이터는 보존되지 않습니다. Linux에서는 대신 다음을 수행할 수 있습니다.

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cp -p /proc/self/fd/0 "$1"; } < "$1"' sh {} \;

디스크가 꽉 찬 경우 cat와 같이 실패하면 복사 하지 못한 cp파일 내용이 손실됩니다 .catcp

파일을 찾은 후 파일의 링크 수가 업데이트되도록 대신 -exec {} \;사용 합니다 .-exec {} +find찾다링크 수가 1로 떨어진 경우 마지막 링크입니다. 즉, 초기 링크 수가 4인 파일의 경우 인스턴스 3개만 덮어쓰게 됩니다.

GNU를 사용하면 tar다음과 같은 작업도 수행할 수 있습니다.

find . -type f -links +1 -print0 |
  tar --hard-dereference --null -T - -cf - | tar xpf -

그러면 더 적은 수의 명령이 실행되지만 더 많은 파일을 덮어쓰게 됩니다.

다음 중 일부를 볼 수 있습니다.

tar: ./file: file changed as we read it

tar대용량 파일의 경우 두 번째 방법으로 파일을 덮어쓰기 전에 연결을 해제하므로 사실상 첫 번째 방법과 매우 유사하므로 괜찮습니다 . tar두 번째 tar가 파일의 링크를 해제할 때 링크 수가 감소하고 결과적으로 ctime이 변경되는 것을 처음으로 알 수 있습니다.

관련 정보