정렬된 순서로 파일을 압축하는 방법은 무엇입니까?

정렬된 순서로 파일을 압축하는 방법은 무엇입니까?

디렉토리에 재귀적으로 액세스하는 경우 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로 끝나도록 지정할 수 있는 방법은 없습니다. 따라서 줄 바꿈이 포함된 파일 이름이 있으면 이 문제가 발생합니다(허용됨).

더 나은 옵션은 cpioNUL로 끝나는 파일 이름 목록을 허용하고 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내보내기 파일을 제거 하고 작성합니다 .tartarfile

관련 정보