을 사용하여 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이 변경되는 것을 처음으로 알 수 있습니다.