Tar
Tar.create
— Functioncreate(
[ predicate, ] dir, [ tarball ];
[ skeleton, ] [ portable = false ]
) -> tarball
predicate :: String --> Bool
dir :: AbstractString
tarball :: Union{AbstractString, AbstractCmd, IO}
skeleton :: Union{AbstractString, AbstractCmd, IO}
portable :: Bool
디렉토리 dir
의 tar 아카이브("tarball")를 생성합니다. 결과 아카이브는 tarball
경로에 기록되거나 경로가 지정되지 않은 경우 임시 경로가 생성되어 함수 호출에 의해 반환됩니다. tarball
이 IO 객체인 경우 tarball 내용은 해당 핸들에 대신 기록됩니다(핸들은 열려 있습니다).
predicate
함수가 전달되면, 이는 dir
을 재귀적으로 검색하는 동안 만나는 각 시스템 경로에 대해 호출되며, predicate(path)
가 true인 경우에만 path
가 tarball에 포함됩니다. predicate(path)
가 디렉토리에 대해 false를 반환하면 해당 디렉토리는 완전히 제외됩니다: 해당 디렉토리 아래의 내용은 아카이브에 포함되지 않습니다.
skeleton
키워드가 전달되면, 주어진 파일 또는 IO 핸들이 tarball 생성을 위한 "스켈레톤"으로 사용됩니다. extract
명령에 skeleton
키워드를 전달하여 스켈레톤 파일을 생성합니다. 해당 스켈레톤 파일로 create
가 호출되고 추출된 파일이 변경되지 않은 경우, 동일한 tarball이 재생성됩니다. skeleton
과 predicate
인자는 함께 사용할 수 없습니다.
portable
플래그가 true인 경우, 경로 이름이 Windows에서 유효성을 검사하여 불법 문자가 포함되지 않거나 예약된 이름이 없도록 합니다. 자세한 내용은 https://stackoverflow.com/a/31976060/659248을 참조하십시오.
Tar.extract
— Functionextract(
[ predicate, ] tarball, [ dir ];
[ skeleton = <none>, ]
[ copy_symlinks = <auto>, ]
[ set_permissions = true, ]
) -> dir
predicate :: Header --> Bool
tarball :: Union{AbstractString, AbstractCmd, IO}
dir :: AbstractString
skeleton :: Union{AbstractString, AbstractCmd, IO}
copy_symlinks :: Bool
set_permissions :: Bool
tarball
경로에 위치한 tar 아카이브를 dir
디렉토리로 추출합니다. tarball
이 경로 대신 IO 객체인 경우, 아카이브 내용은 해당 IO 스트림에서 읽어옵니다. 아카이브는 dir
로 추출되며, dir
은 기존의 빈 디렉토리이거나 새 디렉토리로 생성할 수 있는 존재하지 않는 경로여야 합니다. dir
이 지정되지 않으면, 아카이브는 임시 디렉토리에 추출되며, 이 임시 디렉토리는 extract
에 의해 반환됩니다.
predicate
함수가 전달되면, tarball
을 추출하는 동안 만나는 각 Header
객체에 대해 호출되며, 항목은 predicate(hdr)
가 true일 때만 추출됩니다. 이는 아카이브의 일부만 선택적으로 추출하거나, extract
가 오류를 발생시키는 항목을 건너뛰거나, 추출 과정에서 무엇이 추출되었는지를 기록하는 데 사용할 수 있습니다.
Header
객체는 predicate 함수에 전달되기 전에 tarball의 원시 헤더에서 다소 수정됩니다: path
필드는 .
항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink
인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하게 됩니다; 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).
skeleton
키워드가 전달되면, 추출된 tarball의 "스켈레톤"이 주어진 파일 또는 IO 핸들에 기록됩니다. 이 스켈레톤 파일은 create
함수에 skeleton
키워드를 전달하여 동일한 tarball을 재생성하는 데 사용할 수 있습니다. skeleton
과 predicate
인자는 함께 사용할 수 없습니다.
copy_symlinks
가 true
인 경우, 심볼릭 링크를 그대로 추출하는 대신, tarball 내부에 있고 가능할 경우 링크된 내용을 복사하여 추출됩니다. /etc/passwd
와 같은 비내부 심볼릭 링크는 복사되지 않습니다. 어떤 식으로든 순환하는 심볼릭 링크도 복사되지 않으며 대신 건너뛰어집니다. 기본적으로, extract
는 dir
에서 심볼릭 링크를 생성할 수 있는지 여부를 감지하고, 생성할 수 없는 경우 자동으로 심볼릭 링크를 복사합니다.
set_permissions
가 false
인 경우, 추출된 파일에 대한 권한이 설정되지 않습니다.
Tar.list
— Functionlist(tarball; [ strict = true ]) -> Vector{Header}
list(callback, tarball; [ strict = true ])
callback :: Header, [ <data> ] --> Any
tarball :: Union{AbstractString, AbstractCmd, IO}
strict :: Bool
주어진 경로 tarball
에 위치한 tar 아카이브("tarball")의 내용을 나열합니다. tarball
이 IO 핸들이면 해당 스트림에서 tar 내용을 읽습니다. Header
구조체의 벡터를 반환합니다. 자세한 내용은 Header
를 참조하십시오.
callback
이 제공되면 헤더의 벡터를 반환하는 대신 각 Header
에 대해 콜백이 호출됩니다. 이는 tarball의 항목 수가 많거나 tarball의 오류 이전에 항목을 검사하고 싶을 때 유용할 수 있습니다. callback
함수가 Vector{UInt8}
또는 Vector{Pair{Symbol, String}}
유형의 두 번째 인수를 수용할 수 있는 경우, 원시 헤더 데이터의 표현으로 호출되며, 이는 단일 바이트 벡터 또는 필드 이름을 해당 필드의 원시 데이터에 매핑하는 쌍의 벡터로 제공됩니다(이 필드들이 함께 연결되면 결과는 헤더의 원시 데이터입니다).
기본적으로 list
는 extract
함수가 추출을 거부할 tarball 내용이 발견되면 오류를 발생시킵니다. strict=false
로 설정하면 이러한 검사를 건너뛰고 extract
가 추출할 수 있는지 여부에 관계없이 tar 파일의 모든 내용을 나열합니다. 악의적인 tarball은 당신을 속이기 위해 여러 가지 교묘하고 예상치 못한 일을 할 수 있으니 주의하십시오.
tarball
인수가 스켈레톤 파일(see extract
and create
)인 경우, list
는 파일 헤더에서 이를 감지하고 스켈레톤 파일의 헤더를 적절하게 나열하거나 반복합니다.
Tar.rewrite
— Functionrewrite(
[ predicate, ] old_tarball, [ new_tarball ];
[ portable = false, ]
) -> new_tarball
predicate :: Header --> Bool
old_tarball :: Union{AbstractString, AbstractCmd, IO}
new_tarball :: Union{AbstractString, AbstractCmd, IO}
portable :: Bool
old_tarball
을 create
가 생성하는 표준 형식으로 다시 작성하면서, extract
가 오류를 발생시키는 원인이 되는 내용을 포함하지 않도록 확인합니다. 이는 기능적으로 다음과 같습니다.
Tar.create(Tar.extract(predicate, old_tarball), new_tarball)
그러나, 디스크에 아무것도 추출하지 않고 대신 seek
함수를 사용하여 이전 tarball의 데이터를 탐색합니다. new_tarball
인수가 전달되지 않으면, 새로운 tarball은 경로가 반환되는 임시 파일에 작성됩니다.
predicate
함수가 전달되면, old_tarball
을 추출하는 동안 만나는 각 Header
객체에 대해 호출되며, predicate(hdr)
가 true가 아닌 경우 항목은 건너뜁니다. 이는 아카이브의 일부만 선택적으로 다시 작성하거나, extract
가 오류를 발생시키는 항목을 건너뛰거나, 다시 작성 과정에서 만나는 내용을 기록하는 데 사용할 수 있습니다.
predicate
함수에 전달되기 전에 Header
객체는 tarball의 원시 헤더에서 다소 수정됩니다: path
필드는 .
항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink
인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하도록 합니다. 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).
portable
플래그가 true인 경우, 경로 이름이 Windows에서 유효성을 검사하여 불법 문자가 포함되지 않거나 예약된 이름이 없도록 합니다. 자세한 내용은 https://stackoverflow.com/a/31976060/659248을 참조하십시오.
Tar.tree_hash
— Functiontree_hash([ predicate, ] tarball;
[ algorithm = "git-sha1", ]
[ skip_empty = false ]) -> hash::String
predicate :: Header --> Bool
tarball :: Union{AbstractString, AbstractCmd, IO}
algorithm :: AbstractString
skip_empty :: Bool
tarball이 포함하고 있는 파일 트리에 대한 트리 해시 값을 계산합니다. 기본적으로 이는 SHA1 보안 해시 함수를 사용하는 git의 트리 해싱 알고리즘을 사용합니다(현재 버전의 git과 유사). 이는 git이 표현할 수 있는 파일 트리를 가진 모든 tarball—즉, 파일, 심볼릭 링크 및 비어 있지 않은 디렉토리만 있는 tarball—에 대해 이 함수로 계산된 해시 값이 해당 파일 트리에 대해 git이 계산할 해시 값과 동일함을 의미합니다. tarball은 git이 저장할 수 없는 비어 있는 디렉토리를 포함하는 파일 트리를 표현할 수 있으며, 이 함수는 이러한 디렉토리에 대한 해시를 생성할 수 있습니다. 기본적으로(아래의 skip_empty
를 참조하여 이 동작을 변경하는 방법) 이러한 비어 있는 디렉토리를 생략하는 tarball의 해시와는 다릅니다. 요약하자면, 해시 함수는 git이 표현할 수 있는 모든 트리에 대해 git과 일치하지만, git이 표현할 수 없는 다른 트리에 대해 해시 가능한 트리의 도메인을 일관된 방식으로 확장합니다.
predicate
함수가 전달되면, tarball
을 처리하는 동안 만나는 각 Header
객체에 대해 호출되며, predicate(hdr)
가 true인 경우에만 항목이 해시됩니다. 이는 아카이브의 일부만 선택적으로 해시하거나, extract
가 오류를 발생시키는 항목을 건너뛰거나, 해싱 과정에서 추출된 내용을 기록하는 데 사용할 수 있습니다.
Header
객체는 predicate 함수에 전달되기 전에 tarball의 원시 헤더에서 다소 수정됩니다: path
필드는 .
항목을 제거하고 여러 개의 연속 슬래시를 단일 슬래시로 대체하도록 정규화됩니다. 항목의 유형이 :hardlink
인 경우, 링크 대상 경로도 동일한 방식으로 정규화되어 대상 항목의 경로와 일치하도록 합니다; 크기 필드는 대상 경로의 크기로 설정됩니다(이미 본 파일이어야 함).
현재 지원되는 algorithm
값은 git-sha1
(기본값)과 git-sha256
이며, 이는 git-sha1
과 동일한 기본 알고리즘을 사용하지만 SHA1 해시 함수를 SHA2-256으로 교체합니다. 이는 git이 향후 사용할 해시 함수입니다(SHA1에 대한 알려진 공격으로 인해). 향후 다른 파일 트리 해싱 알고리즘에 대한 지원이 추가될 수 있습니다.
skip_empty
옵션은 파일이나 심볼릭 링크가 재귀적으로 포함되지 않은 tarball의 디렉토리를 해시에 포함할지 무시할지를 제어합니다. 일반적으로 tarball이나 파일 트리의 내용을 해시하는 경우, 비어 있지 않은 디렉토리뿐만 아니라 모든 디렉토리에 관심이 있으므로 이러한 디렉토리를 계산된 해시에 포함하는 것이 기본값입니다. 그렇다면 이 함수가 비어 있는 디렉토리를 건너뛰는 옵션을 제공하는 이유는 무엇인가요? git은 비어 있는 디렉토리를 저장하는 것을 거부하고, 이를 repo에 추가하려고 하면 무시합니다. 따라서 git repo에 파일을 추가하여 참조 트리 해시를 계산한 후 git에 트리 해시를 요청하면, 얻는 해시 값은 skip_empty=true
로 tree_hash
로 계산된 해시 값과 일치합니다. 다시 말해, 이 옵션은 tree_hash
가 비어 있는 디렉토리가 있는 트리를 해시하는 방법을 에뮬레이트할 수 있게 해줍니다. 그러나 비어 있는 디렉토리를 포함할 수 있는 트리를 해시하는 경우(즉, git repo에서 오지 않는 경우), 비어 있는 디렉토리를 무시하지 않는 도구(이 도구와 같은)를 사용하여 해시하는 것이 권장됩니다.
Tar.Header
— TypeHeader
타입은 tar 파일의 단일 레코드에 대한 필수 메타데이터를 나타내는 구조체로, 다음과 같은 정의를 가지고 있습니다:
struct Header
path :: String # root에 대한 상대 경로
type :: Symbol # 타입 표시기 (아래 참조)
mode :: UInt16 # 모드/권한 (8진수로 보는 것이 가장 좋음)
size :: Int64 # 레코드 데이터의 크기 (바이트 단위)
link :: String # 심볼릭 링크의 대상 경로
end
타입은 다음 기호로 표현됩니다: file
, hardlink
, symlink
, chardev
, blockdev
, directory
, fifo
, 또는 알 수 없는 타입의 경우 타입 플래그 문자를 기호로 사용합니다. extract
는 file
, symlink
및 directory
이외의 레코드 타입을 추출하는 것을 거부합니다; list
는 strict=false
로 호출될 경우 다른 종류의 레코드만 나열합니다.
tar 형식은 레코드에 대한 다양한 다른 메타데이터를 포함하며, 여기에는 사용자 및 그룹 ID, 사용자 및 그룹 이름, 타임스탬프가 포함됩니다. Tar
패키지는 설계상 이들을 완전히 무시합니다. tar 파일을 생성할 때, 이 필드는 항상 0/비어 있는 값으로 설정됩니다. tar 파일을 읽을 때, 이 필드는 모든 필드에 대해 각 헤더 레코드의 체크섬을 검증하는 것을 제외하고는 무시됩니다.