TAR 파일: 하위 디렉터리에서 기본 디렉터리로 파일 이동

TAR 파일: 하위 디렉터리에서 기본 디렉터리로 파일 이동

나는 이 코드를 사용하려고 했습니다.

find documents -maxdepth 1 -type f -print0 | xargs -0 tar cvf documents.tar.gz

카탈로그 문서의 백업을 만듭니다.

이 디렉토리의 구조는 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

단일 디렉터리인 files/에 보관하고 싶습니다.

여기에 이미지 설명을 입력하세요.

그러나 나는 그렇게 하지 못했습니다. 어떻게 해야 하나요? 감사해요

답변1

tar 대신 다른 디렉토리에 하드 링크할 수 있습니다.

# find all files in directory named directory
find directory -type f | \
while read f;
do
    f2=`echo "$f"|sed -e 's/\//:/g'`  # replace / with :
    ln "$f" "directory2/$f2"  # create hardlinks in directory2/
done

그러면 다음 링크가 생성됩니다.

directory/file1 => directory2/directory:file1
directory/file2 => directory2/directory:file2
directory/folder1/file3 => directory2/directory:folder1:file3
directory/folder1/file4 => directory2/directory:folder1:file4
directory/folder2/file5 => directory2/directory:folder2:file5
directory/folder3/folder4/file6 => directory2/directory:folder3:folder4:file6
directory/folder3/folder4/file7 => directory2/directory:folder3:folder4:file7

답변2

내가 원하는 방법은 백업 소스로 새 디렉토리를 생성하고 하드 링크로 채우는 것입니다. 백업하려는 전체 디렉터리 트리가 동일한 볼륨에 있기를 바랍니다.

> pwd
/path/to/documents
> cd /path/to/
> mkdir tar-documents
> mkdir tar-documents/documents
> ln /path/to/documents/file1
> ln /path/to/documents/file2
> ln /path/to/documents/folder1/file3 folder1:file3
[...]

파일 수가 많으면 스크립트를 통해 수행해야 합니다.

그런 다음 tar이 디렉터리에서 실행합니다.

> cd /path/to/tar-documents
> tar cvzf /backup/path/documents.tar.gz documents

마지막에 디렉토리를 삭제하는 것이 tar유용할 수 있습니다 .

답변3

이것을 시도해 볼 수 있습니다.

*tar현재 폴더에서 모든 파일을 찾아 MainDirectory폴더나 원하는 위치에 복사하세요.

find . -iname "*tar*" -exec cp {} ~/MainDirectory/ \;

답변4

첫째, 디렉토리를 아카이브하는 경우 아카이브에 동일한 파일 구조를 갖는 것이 해당 스냅샷을 만드는 가장 좋은 방법입니다. 당신이 요구하는 것은 상위 디렉토리, 콜론, 파일 이름을 포함하도록 파일 이름을 바꾸는 것입니다. 그러나 나에게 이상한 점은 이것이 맥락에서 벗어났다는 것입니다. 나는 --transform이 옵션을 사용하여 꽤 가까워 졌습니다 .

 --transform=EXPRESSION, --xform=EXPRESSION
                         use sed replace EXPRESSION to transform file

예가 다음에 설명되어 있습니다.이 스택 교환 답변 (이건 아니지만 참고해주세요.올바른 sed문법). 명령을 사용하면 --transform다음과 같습니다.

tar czvf documents.tar.gz --transform 's/\//:/g' documents

불행하게도 이는 하위 디렉터리를 아카이브에 유지하므로 원하는 효과를 얻지 못하지만 하위 디렉터리는 비어 있고 파일은 첫 번째 상위 디렉터리가 아닌 아카이브의 루트에 있습니다.

옵션을 사용하는 솔루션이 있다고 생각 -C, --directory하지만 그다지 동적이 아니며 새 파일 이름으로 파일의 디렉터리 이름을 유지하는 데 적합하지 않습니다.

내가 찾은 해결책은 귀하가 가지고 있는 솔루션과 변환 명령의 사용을 혼합한 것입니다.

find documents -type f -print0 | xargs -0 tar czvf test.tar.gz --no-recursion --transform 's/\//:/g' --transform 's:\::/:1' documents/

또한 귀하의 질문에 파일 이름을 확장자로 지정했지만 .gz해당 -z, --gzip옵션이 없습니다.

이것이 도움이 되길 바랍니다,
알렉스

관련 정보