디렉토리에 재귀적으로 액세스하는 경우 tar
운영 체제의 readdir
.
그러나 어떤 경우에는 정렬된 파일을 tar로 처리하는 것이 더 좋습니다.
알파벳순으로 정렬된 디렉토리를 압축하는 좋은 방법은 무엇입니까?
이 질문의 목적에 따라 일반적인 Linux 시스템의 gnu-tar는 괜찮습니다.
답변1
GNU의 경우 tar
:
--sort=ORDER
Specify the directory sorting order when reading directories.
ORDER may be one of the following:
`none'
No directory sorting is performed. This is the default.
`name'
Sort the directory entries on name. The operating system may
deliver directory entries in a more or less random order, and
sorting them makes archive creation reproducible.
`inode'
Sort the directory entries on inode number. Sorting
directories on inode number may reduce the amount of disk
seek operations when creating an archive for some file
systems.
당신은 또한 한 번 살펴보고 싶을 수도 있습니다 --preserve-order
.
답변2
...을 사용하여 zsh
다음을 교체합니다.
pax -w dir
사용:
pax -dw dir dir/**/*(D)
최신 버전에서도 동일한 작업을 수행할 수 있습니다 bash -O globstar -O dotglob
.
pax -dw dir/**
또는 최신 버전 FIGNORE='@(.|..)' ksh93 -o globstar
:
pax -dw dir dir/**
pax
파일을 생성하는 표준 명령입니다 tar
. 출력은 표준 출력으로 이동합니다. 쉘 글로브는 이름별로 정렬됩니다.
당신이 만난다면매개변수 목록이 너무 깁니다.오류는 다음과 같이 변경될 수 있습니다.
printf '%s\0' dir dir/**/*(D) | pax -0dw
(그러나 pax
모든 구현에서 지원되는 것은 아닙니다 -0
).
답변3
tar
이 작업은 자체적으로 수행할 수 없으므로 적절하게 정렬된 목록에서 생성해야 합니다. 원칙적으로 tar
' 옵션을 사용할 수 있지만 -T
이 목록의 파일 이름이 NUL로 끝나도록 지정할 수 있는 방법은 없습니다. 따라서 줄 바꿈이 포함된 파일 이름이 있으면 이 문제가 발생합니다(허용됨).
더 나은 옵션은 cpio
NUL로 끝나는 파일 이름 목록을 허용하고 tar 파일을 생성할 수 있으므로 파일을 생성하는 데 사용하는 것입니다.
귀하의 tar
명령이 다음과 같은 경우:
tar cvf /somedir/all.tar .
그런 다음 이름별로 정렬하려면 다음을 수행해야 합니다(GNU find 및 cpio 가정).
find . -type f -print0 | sort -z | \
cpio --create --null --format=ustar -O /somedir/all.tar
하위 디렉터리가 파일 이름 사이에 위치하지만 여기에는 단점이 있습니다. s -printf0을 사용하여 find
디렉토리 및 깊이 정보를 지정하고 정렬 할 수 있지만 sort -n
이는 숫자가 있는 파일이 디렉토리에서 정렬되는 방식에도 영향을 미칩니다.
위의 내용이 만족스럽지 않으면 작은 Python 프로그램을 사용하여 원하는 전체 제어(깊이 우선, 확장 기반 등)로 정렬을 생성할 수 있지만 os.walk()
이 경로를 사용하면 다음과 같이 될 수 있습니다. Python 모듈을 사용하여 cpio
내보내기 파일을 제거 하고 작성합니다 .tar
tarfile