Bagaimana cara tar file dengan urutan diurutkan?

10

Jika Anda tardirektori secara rekursif, itu hanya menggunakan urutan dari os readdir.

Tetapi dalam beberapa kasus itu bagus untuk tar file diurutkan.

Apa cara yang baik untuk membuat direktori yang diurutkan berdasarkan abjad?


Catatan, untuk keperluan pertanyaan ini, gnu-tar pada sistem Linux biasa tidak masalah.

gagasanman42
sumber
kemungkinan duplikat di bawah ini, Periksa tautan di bawah ini unix.stackexchange.com/questions/120143/... superuser.com/questions/172367/…
Jaymin Dabhi
Saya melihat ini, tetapi saya tidak bertanya bagaimana urutannya, saya ingin menyortirnya.
ideasman42
Lihat juga unix.stackexchange.com/a/67018 untuk mengurutkan pohon direktori berdasarkan nama.
Stéphane Chazelas

Jawaban:

17

Untuk 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.

Anda mungkin juga ingin melihatnya --preserve-order.

mikeserv
sumber
8
--sortdiperkenalkan di versi tar 1.28. --preserve-ordertidak relevan dengan pertanyaan ini.
mhsmith
Saya terus mengalami tar: Exiting with failure status due to previous errorskesalahan. @mhsmith
alper
3

Dengan zsh, alih-alih:

pax -w dir

Menggunakan:

pax -dw dir dir/**/*(D)

Anda dapat melakukan hal yang sama dengan versi terbaru bash -O globstar -O dotglobdengan:

pax -dw dir/**

Atau versi terbaru FIGNORE='@(.|..)' ksh93 -o globstardengan:

pax -dw dir dir/**

paxadalah perintah standar untuk membuat tarfile. Outputnya menuju stdout. Gumpalan shell diurutkan berdasarkan nama.

Jika Anda mengalami kesalahan pada daftar Arg , Anda dapat mengubah ke:

printf '%s\0' dir dir/**/*(D) | pax -0dw

(meskipun tidak semua paximplementasi mendukung -0).

Stéphane Chazelas
sumber
2

taritu sendiri tidak dapat melakukan ini, jadi Anda harus membuatnya dari daftar yang dipesan dengan benar. Pada prinsipnya Anda kemudian dapat menggunakan tar's -Tpilihan, tetapi tidak ada cara untuk menentukan bahwa nama file dalam daftar yang harus NUL dihentikan. Jadi, jika Anda memiliki nama file dengan baris baru di dalamnya (yang diizinkan) ini akan rusak.

Opsi yang lebih baik adalah menggunakan cpiountuk menghasilkan file karena menerima daftar nama file yang diakhiri NUL dan dapat menghasilkan file tar.

Jika tarperintah Anda adalah:

tar cvf /somedir/all.tar .

Maka untuk ini akan diurutkan berdasarkan nama yang harus Anda lakukan (dengan asumsi GNU find and cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Ini memiliki kekurangan meskipun subdirektori ditempatkan di antara nama file. Anda dapat melakukan trik dengan finds -printf0 menentukan direktori dan informasi kedalaman dan menyortir dengan sort -ntetapi itu juga mempengaruhi bagaimana file dengan angka diurutkan dalam direktori.

Jika hal di atas tidak memuaskan Anda mungkin bisa menggunakan program python kecil berdasarkan os.walk()untuk menghasilkan pemesanan yang Anda inginkan dengan kontrol penuh (kedalaman pertama, berdasarkan extenion dll), tetapi jika Anda pergi rute itu Anda mungkin juga drop cpiodan tuliskan tarfile dengan tarfilemodul python .

Anthon
sumber
1
--null menetapkan bahwa -T mengambil string null yang diakhiri.
psusi