이것을 사용하여 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
파일 내용을 잃게 되거나 복사할 수 없게 됩니다.cat
cp
-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이 변경됨).