Bagaimana cara membuat file tar dalam urutan abjad?

22

Saya ingin membuat file tar di mana semua direktori dan file diproses dalam urutan abjad. Ini untuk seluruh hierarki direktori yang sedang ditutup, jadi itu akan mulai dengan memproses direktori pertama secara alfabet, dan kemudian sub-direktori di sana secara alfabet, dll. Saya melihat-lihat halaman manual dan tidak dapat menemukan saklar untuk ini.

Saya akui, ini setengah baru, setengah sedikit optimasi. Saya hanya tidak percaya bahwa tidak ada cara mudah untuk melakukan ini. Saya pasti melewatkan sesuatu.

Erick Robertson
sumber
2
Mengapa Anda ingin melakukan ini?
matthias krull
Sebagian besar, itu karena saya ingin tahu seberapa dekat operasi tar untuk diselesaikan. Ketika file sedang dimuat dalam urutan acak, tidak ada cara untuk mengetahui dengan flag -v.
Erick Robertson
2
Itu tidak sepenuhnya benar; Jika Anda mem-pipe output ke file dan mengetahui jumlah file (katakan perintah quick find), Anda dapat membandingkan -v output (wc -l) dengan jumlah file dari find untuk mendapatkan rasa kemajuan ...
Slartibartfast
2
@matthiaskrull Saya punya alasan yang tidak berhubungan untuk ini, saya membuat file OVA (yang merupakan file tar) untuk menggunakan VM di VMWare ESX Server. OVA membutuhkan file dalam urutan tertentu di dalamnya (File pertama harus berupa OVF dan sebagainya).
xask
1
Ada juga alasan yang sangat bagus untuk ini: kinerja pada file yang sangat besar ketika Anda ingin mengekstraksi sebagian saja. Karena urutannya secara acak acak, dan Anda ingin mengekstrak file / direktori, jika itu dipesan akan lebih cepat, jika tidak, ia perlu memindai seluruh arsip sebelum ia tahu itu selesai.
StormByte

Jawaban:

12

Slartibartfast berada di jalur yang benar, tetapi perilaku default tar adalah turun ke direktori, jadi Anda bisa mendapatkan lebih dari satu salinan file yang sama yang termasuk dalam file tar yang dihasilkan. Anda dapat memeriksa dengan melakukan tar tf file.tar | sort solusinya adalah dengan menyertakan opsi --no-recursion ke tar. Selain itu, Anda harus dapat mengirim nama file aneh dengan menggunakan -print0 opsi untuk menemukan, kemudian menggunakan --nullopsi untuk tar. Hasil akhirnya terlihat seperti ini:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Anda dapat memeriksa pesanan dalam file tar dengan menggunakan tar tsf tarfile.tar. Meskipun Anda mungkin tidak akan memerlukan opsi -print0, -z, dan --null kecuali Anda tahu Anda akan menemukan nama file dengan baris baru yang tertanam di dalamnya, saya belum pernah mencobanya.

Charlie Herron
sumber
Saran yang bagus untuk menggunakan opsi --no-recursion, terima kasih.
Erik
Ini adalah solusi yang berhasil untuk saya. Saya memiliki kasus penggunaan yang berbeda dari Erick dan Google membawa saya ke sini. Saya mengumpulkan snapshot dari waktu ke waktu kondisi lengkap sistem remote. Data tersebut sangat redundan. Menyortir input tar berdasarkan waktu (nama file memiliki cap waktu) meningkatkan kinerja kompresor. Tes cepat menunjukkan peningkatan dengan faktor 2 (lzma2). Juga, saya tidak membongkar arsip ke sistem file, tetapi melakukan pemrosesan aliran melalui entri tar. Aliran yang diurutkan membuat output debug jauh lebih baik dan memiliki manfaat lain dalam rantai proses. +1
Johannes
5

Urutan file dalam file tar tidak terlalu penting, karena ketika file diekstraksi, sistem file tidak akan mempertahankan urutannya.

Tidak ada saklar untuk ini, tetapi jika Anda benar-benar menginginkannya, Anda bisa menyediakan tar dengan daftar nama file dalam urutan, dan itu akan membuat file tar dengan urutan yang Anda berikan.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup
Kevin Panko
sumber
2
atau hanya mengurutkan output:tar tf tarfile | sort
Doug Harris
Saya memiliki terlalu banyak file (20.000+) untuk menentukan semuanya pada baris perintah.
Erick Robertson
4
Urutan file dalam file tar tidak masalah jika Anda perlu mendekompresi dan ditampilkan saat mengunduh.
Erik
Tergantung pada sistem file.
Thorbjørn Ravn Andersen
4

Dengan asumsi Anda tidak memiliki file dengan baris baru di namanya:

find /source_directory -print | sort | tar -czf target.tgz -T -

Jika itu tidak berhasil (tidak pernah mencobanya, jadi saya tidak tahu - berarti stdin untuk argumen -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Lalu ada pertanyaan mengapa. Namun terkadang lebih mudah untuk tidak bertanya.

Slartibartfast
sumber
2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax adalah semacam penerus POSIX untuk cpio dan tar dan jenis sekering aspek terbaik dari keduanya. Ini menulis arsip tar (ustar) secara default. Ini juga melakukan spanning otomatis dan meminta media dan mencetak ringkasan ketika sudah selesai.

Thomas Crescenzi
sumber
0

Sebagai alternatif dari jawaban @ CharlieHerron, jika Anda hanya tertarik untuk mempertahankan konten (file, symlink) dan folder meta-data (misalnya, izin folder, mtime, dll.), Anda mungkin ingin menyaring folder dari findoutput.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
pengguna1202136
sumber