membuat arsip tar tanpa menyertakan direktori induk

62

Saya mencoba membuat program grafis untuk skrip saya.

Di dalam skrip saya menggunakan tar untuk membuat arsip tar.

Dari program grafis saya mendapatkan nama lengkap file yang ingin saya buat arsip tar.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Arsip tar saya mencakup rumah, nama pengguna, dir1, dir2, dan selecteddir sementara saya ingin tar membuat arsip hanya termasuk selecteddir.

Sujit Maharjan
sumber

Jawaban:

79

Anda dapat menggunakan -Copsi taruntuk mencapai ini:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Dari halaman manual dari tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.
mkc
sumber
apakah Anda tahu bagaimana saya dapat membagi $ path menjadi selecteddir dan path upto / home / username / dir1 / dir2 sehingga saya dapat pengguna opsi -C
Sujit Maharjan
@SujitMaharjan dapat Anda gunakan dirnameuntuk mengekstrak semuanya hingga "selecteddir" dan basenameuntuk mengekstrak "selecteddir". Coba dua perintah dengan $ path sebagai argumen.
mkc
2
Layak menambahkan bahwa ini berlaku untuk GNU dan BSD Tar.
Luke Exton
5
Perhatikan bahwa Anda tidak dapat menggunakan globbing dengan opsi -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'tidak akan bekerja
Christian Long
Tidak berfungsi: tar: selecteddir: Tidak bisa stat: Tidak ada file atau direktori seperti itu
tribbloid
11

Ada dua metode yang dapat Anda gunakan untuk mendekati masalah ini.

Yang pertama, menurut saya, lebih mudah. Cukup cdke direktori langsung di atas yang ingin Anda kompres. Dalam hal ini akan menjadi dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

Cara kedua adalah menggunakan opsi --transformyang mengambil sedekspresi dan menjalankannya terhadap nama file. Catatan: Anda harus melarikan diri /dalam sedekspresi.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'
ryanmjacobs
sumber
Apakah metode pertama memerlukan titik (.) Di bagian akhir? Aku mencoba tanpa dan mendapat: tar: Cowardly refusing to create an empty archive. Ketika saya memiliki titik, itu mengganggu membuat root berisi direktori bernama .. Jadi, dekat tapi tidak sempurna.
JW01
1
Lebih jauh ke komentar saya sebelumnya. Saya memecahkan masalah saya. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *bekerja untukku. Menggunakan tanda bintang, bukan titik .. Perbarui: Woops - Meskipun saya kehilangan file yang tersembunyi.
JW01
6

Pertama, buka direktori kerja,

cd /your/working/directory/ 

Kemudian gunakan sihir *:-)

tar -cvf temp.tar *
Yas
sumber
Saya mencoba mengarsipkan direktori tersembunyi dan jika saya menambahkannya secara langsung (Tidak *) berfungsi, tetapi ketika menggunakan * itu hanya menambah nama arsip ke arsip ...
Ole
1

Sebenarnya, saya menemukan masalah menggunakan jawaban Ketan

tar -C / home / username / dir1 / dir2 -cvf temp.tar selecteddir

Bila Anda hanya ingin menyalin semua file hanya di dir2, cukup semua file maka saya pertama kali keluar ide:

tar -C / home / nama pengguna / dir1 / dir2 -cvf temp.tar *

Namun, ketika Anda tidak berada di direktori dir2, itu akan menyebabkan masalah karena * akan tar file di diectroy Anda saat ini. Dan saya memperbaiki masalah menggunakan perintah di bawah ini:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./
Guan YANG
sumber
6
Tetapi kemudian arsip temp.tar Anda berisi .sebagai folder root.
cgrim