나는 tar가 완전한 디렉토리를 압축하기를 원합니다.
tar cvjf dir.tbz dir
하지만 모든 파일을 삭제하도록 하세요.
tar cvjf dir.tbz dir --remove-files
그러나 이것은 ./dir도 제거합니다. 그래서 포장하기 전에 디렉토리에 CD를 넣으려고했습니다.
tar cvjf dir.tbz --remove-files -C dir .
그러나 그것은 여전히 ./dir을 제거합니다. 왜 tar 작업 디렉토리 자체를 삭제해야 합니까? 나에게는 이해가 되지 않는 것이 무엇입니까? 전체 디렉터리를 삭제하지 않고 전체 디렉터리를 압축하고 압축한 후 파일을 제거할 수 없나요?
./dir에 지속적으로 파일을 생성하고 매 시간마다 모든 파일을 압축한 다음 압축된 파일을 제거하려는 프로세스가 실행 중입니다. tar 후에 mkdir을 삭제하고 삭제할 수 있지만 mkdir이 디렉토리를 다시 생성하기 전에 새 파일을 쓰려고 할 때 파일을 생성하는 다른 프로세스가 어려움을 겪을 수 있습니다.
답변1
다음과 같이 시도해 볼 수 있습니다.
find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz
현재 명령보다 조금 더 복잡하지만 작동하며 경쟁 문제가 있다고 생각하지 않습니다(파일이 1분보다 긴 간격으로 여러 번 기록되지 않는 경우).
이 명령은 1분 이상 된(현재 기록되지 않은) find
모든 파일을 찾습니다 . dir
그런 다음 이 목록은 로 파이프되어 xargs
각 항목을 차례로 파일에 추가합니다 dir.tar
. 파일이 tar 파일에 성공적으로 추가되면 원본이 제거됩니다. 한 번에 하나씩 수행하면 파일 수가 많은 경우 명령줄이 너무 길어지는 문제를 피할 수 있습니다. 마지막으로 tar 파일을 압축하고 이름을 바꿀 수 있습니다.
답변2
이에 대한 해결 방법은 다음과 같습니다.
나는 디렉토리에 CD를 넣고 ./*를 사용하여 내용을 tar한 다음 삭제하는 스크립트를 작성했습니다. 나는 단지 -C가 동일한 작업을 수행하여 하나의 명령줄에 포함할 수 있기를 바랐지만 그렇지 않습니다.
#!/bin/bash
cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files
작동해야합니다.