디렉토리 트리의 모든 파일을 다시 작성하는 명령줄 도구

디렉토리 트리의 모든 파일을 다시 작성하는 명령줄 도구

디렉터리 트리의 모든 일반 파일을 제자리에 다시 작성하거나 새 inode를 생성하여 다시 작성하는 데 사용할 수 있는 명령줄 도구가 있습니까?

그리고제자리에 파일 다시 쓰기, 내 말은 읽기 및 쓰기를 위해 파일을 열고, 적당한 크기의 청크를 읽고 해당 청크를 동일한 위치에 쓰는 것입니다. 전체 파일에 대해 이 작업을 수행합니다. 기본적으로 이 명령줄이 수행하는 작업은 다음과 같습니다.

find dir -type f -print0 | xargs -0 -n1 bash -c 'dd if="$1" of="$1" conv=notrunc bs=64M' -

반대로, 새 inode가 생성되면 다음 명령이 수행하는 것과 같이 가능한 경우 파일 속성을 바꿔야 합니다.

find dir -type f -print0 | xargs -0 -n1 bash -c 'echo "$1"; cp -a "$1" "$1~" && mv "$1~" "$1"' -


배경:

적절한 경우 ZFS 중복 제거를 사용하기 위한 경험을 쌓고 모범 사례를 찾으려고 노력하고 있습니다. ZFS 중복 제거 사용법DDT(중복 제거 테이블) 파일에 지정된 크기의 블록에서 작동합니다.레코드 크기이는 중복 제거 효율성과 메모리 사용량에 영향을 미칩니다. 작성된 데이터를 마이그레이션하여 DDT 사용을 중지하거나 파일 레코드 크기를 변경할 가능성을 모색 중입니다. ZFS는 기록된 데이터에 대해 이러한 매개변수를 자동으로 변경하지 않으므로 데이터를 다시 작성해야 합니다.

DDT 사용 여부를 변경하려면 해당 위치에서 데이터를 다시 작성하면 됩니다(새 파일을 만들 필요 없음). 하지만 파일의 레코드 크기는 생성될 때 결정되므로 이를 변경하려면 새 파일을 생성해야 합니다.

답변1

방금 이 작업을 수행할 수 있는 도구를 만들었습니다.

https://github.com/pjd/filerewrite

또는 ZFS를 사용하여 대상 파일 시스템에서 중복 제거가 활성화된 zfs send/recv를 사용할 수도 있습니다. 그런 다음 파일 시스템의 이름을 바꾸고 다른 모든 파일 시스템 속성이 이동되었는지 확인해야 합니다.

답변2

(이 질문은 내가 이 글을 쓰는 시점에서 1년이 지났지만 내 댓글 대기열에 표시되었으므로 다른 사람이 비슷한 요구 사항을 검색하는 경우에 답변하겠습니다.)

그런 도구가 존재할 가능성은 거의 없습니다그리고다양한 파일 시스템 유형, 특히 시스템 루트 트리의 다양한 지점에 여러 파일 시스템 유형이 마운트될 수 있는 *nix 시스템에서 안정적입니다. 그 이유는 일부 파일 시스템이 "뒤에서" 추가 작업을 수행할 수 있고 파일 데이터 다시 쓰기를 통해 다시 쓰기가 동일한 위치에서 발생한다는 보장이 없기 때문입니다(실제로 원하는 것은 ZFS에서 이 작업을 정확하게 수행하는 것뿐입니다). 중복을 제거하려면! ) 파일 시스템 자체가 이미 해당 기능을 지원하지 않는 한.

읽기+쓰기 모드로 파일을 연 다음, 블록을 읽고, 블록의 시작 부분으로 돌아가서 다시 쓰는 빠른 프로그램을 작성할 수 있습니다. 이것이 ZFS 중복 제거에 적용되는지, 아니면 어떤 다른 유형의 문제가 발생할 수 있는지는 알 수 없습니다. 예를 들어, 암호화된 파일 시스템에서는 파일을 다시 암호화하거나 물리적 저장 장치에 물리적으로 저장된 위치로 이동해야 할 수도 있습니다. 이는 특정 요구 사항에 따라 이러한 도구를 직접 작성해야 하는 이유 중 일부입니다.

또 다른 방법은 파일 트리를 백업한 다음 원본 파일에서 백업을 복원하는 것입니다. 그러나 위에서 언급한 것처럼 이를 위해서는 일종의 백업 저장소(동일한 물리적 디스크의 다른 위치에 있는 간단한 tar 파일일 수도 있지만)가 필요하고 백업 및 복구 옵션을 적절하게 선택해야 합니다.

최후의 수단으로 디렉토리 트리의 이름을 다른 곳에서 바꾸고 한 번에 하나의 파일을 복사하여 다시 생성할 수 있습니다(새 파일이 안전하게 복사되었는지 확인한 후 이전 파일을 삭제하여 공간을 확보하십시오). 가장 큰 단일 파일의 복사본을 만들려면 여전히 충분한 추가 저장 공간이 필요합니다. 대부분의 경우 이는 쉽게 피할 수 없으며, 특히 파일 시스템 드라이버가 데이터가 실제로 변경되지 않았음을 인식할 수 있을 만큼 효율적이려고 시도하고(예: 블록 해시/체크섬 유지) 불필요한 쓰기를 단순히 삭제하는 경우 더욱 그렇습니다. 컴퓨터의 경우, 메모리 간 작업은 메모리 간 작업보다 훨씬 빠릅니다.

관련 정보