File .tar tanpa struktur direktori


32

Saya sedang .tarmemasukkan beberapa file dengan path example/super_user/Output.*.

Hasilnya .tarterlihat seperti ini:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Tapi saya ingin file seperti berikut:

- Output.zip
- Output.xml
- Output.txt

Apakah Anda tahu bagaimana saya bisa mencapai ini ketika masih berada di direktori lain?


Pastikan untuk menghindari tarbomb dengan arsip seperti itu.
grawity

tar --strip-components = 1000?
Zaar Hai

Jawaban:


11

tar akan mempertahankan struktur file dan folder jadi saya tidak berpikir ada cara untuk menginstruksikan tar untuk meratakan hierarki pada waktu pembuatan.

Salah satu solusinya adalah untuk sementara mengubah direktori, membuat tar, lalu kembali - contoh cepat di bawah ini:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

Jika direktori 'example' adalah akar dari filesystem, berikut cara lain:

tar -C /example/super_user -cvf result.tar .

ini akan mengubah direktori ke titik yang ingin Anda lakukan tar. Peringatannya adalah jika ada subdirektori di bawah / example / super_user, struktur direktori akan dipertahankan untuk sub-direktori ini.


1
Ini adalah jawaban untuk masalah yang dihadapi. Peringatan tersebut tidak menjadi masalah dalam kasus ini. Semua jawaban lain adalah solusi untuk memperhitungkan variasi masalah.
joki

Itu memang solusi untuk pertanyaan ini. Direktori tidak harus menjadi root, seandainya struktur direktori /home/u/foo/bar, direktori kerja /home/b, kemudian tar -C foo/bar -cvf qiz.tar .bekerja dengan baik. Satu peringatan, adalah bahwa Anda tidak dapat menggunakan wildcard, yaitu tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"atau tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"tidak akan berfungsi.
Brice

1
Perlu dicatat bahwa Anda dapat menggunakan -Cbeberapa kali dalam satu tarperintah jika Anda perlu menambahkan beberapa file yang tersebar di beberapa direktori tetapi masih ingin file tar menjadi datar.
zero298

10

Saya sudah mengirimkan jawaban saya di sini:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

repost (untuk ppl malas)


Ini jelek ... tapi berhasil ...

Saya memiliki masalah yang sama tetapi dengan beberapa folder, saya hanya ingin menyingkat setiap file. Anda dapat menggunakan opsi "transform" untuk memberikan ekspresi sed dan ... ini berfungsi seperti yang diharapkan.

inilah ungkapan:

's/.*\///g' (hapus semuanya sebelum '/')

Ini adalah perintah terakhir:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

Untuk membuat tar (ARCHIVE.tar) dengan semua file dari direktori (DIR), tanpa informasi direktori induk (bahkan tidak ./), Anda dapat menggunakan sesuatu seperti:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Anda dapat bermain dengan find untuk membatasi kedalaman, memilih file tertentu, dan banyak hal lainnya.

Semoga berhasil!


Saya mendapatkan "find: -printf: primary atau operator tidak dikenal" di perintah OSX find. Ada tips?
TCB13

-printfadalah perintah yang tidak standar. Banyak dari mereka hanya bekerja dengan versi spesifik dari find. Biasanya kami menandai mereka ketika menjawab pertanyaan tentang Pengguna Super (misalnya dengan "-blah adalah ekstensi Gnu dan tidak akan bekerja di mana-mana").
Hennes

3

Saya membuat direktori temp. Dan dalam direktori, dibuat tautan simbolis ke semua file ke file yang akan disertakan. Lalu aku melakukan tar-h -C. sehingga semua file (bukan tautan, tetapi kontennya) dimasukkan dalam arsip dengan nama yang diinginkan.


1

Jika itu adalah seluruh isi tarball maka Anda dapat menggunakan --strip-componentsopsi tar GNU untuk menghapus 2 level sebelum file.


Saya hanya punya pilihan --strip-pathtetapi menggunakannya tidak akan mengubah apa pun.

1

Cara lain untuk mengubah direktori sementara adalah untuk menempatkan cddan tarperintah dalam kurung ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Keuntungan dari ini, adalah, Anda akan selalu secara implisit kembali ke direktori asli ketika blok selesai. yaitu tidak perlu pushd.. popdblok atau melacak ke mana harus cdkembali ke.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd mendorong jalur direktori saat ini ke DIRtumpukan dan pindah ke folder konten. Kemudian, Anda kembali ke direktori asli dengan menggunakan popd.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.