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

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

이것을 사용하여 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이 변경됨).

관련 정보