Bagaimana cara mengekstrak file ke direktori lain menggunakan perintah 'tar'?

672

Saya pikir tar archive.tar /users/mylocationakan berhasil, tetapi tidak. Bagaimana saya bisa melakukan itu?

goovim
sumber
1
Juga, -C, --directory DIR\n change to directory DIRlebih baik digambarkan sebagai change output directory to DIR (will fail if DIR doesn't exist). Terima kasih @Mich. Lihat juga jawaban @ Bryan_Larsen.
berlaku
1
@Ujjwal Sing: Memang, halaman tar tar tidak begitu membantu. Ini menggambarkan "-C DIR" sebagai "ubah ke direktori DIR". Lebih buruk lagi: "tar -C mydir xf archive.tar" tidak berfungsi, sementara "tar xf archive.tar -C mydir" tidak berfungsi.
Pat Morin
@PatMorin Agar adil, setelah Anda memahami konvensi pemanggilan argumen yang Anda gunakan masuk akal. Anda juga dapat melakukan tar xfC archive.tar mydiratau tar -C mydir -xf archive.tar. Itu hanya mencampur bendera gaya tradisional dan gaya GNU yang merusak segalanya, seperti ... yang diharapkan secara jujur. Bendera tradisional dilewatkan semua sebagai satu gumpalan sebagai argumen pertama. Anda tidak dapat mengharapkan mereka bekerja jika mereka bukan yang pertama. (Maksudku, ya, toh itu mungkin untuk menafsirkannya - maksud saya adalah bahwa itu akan di atas dan di luar, bukan standar)
Nic Hartley

Jawaban:

958

Untuk mengekstrak arsip ke direktori yang berbeda dari yang sekarang, gunakan opsi -C, atau --directory, tar, seperti pada

tar -xf archive.tar -C /target/directory

Perhatikan bahwa direktori target harus ada sebelum menjalankan perintah itu (dapat dibuat oleh mkdir /target/directory).

Baca halaman manual (perintah:) man taruntuk opsi lain.

Wesley Rice
sumber
Dapatkah jalan dilucuti: yaitu hanya mengambil file
zzapper
3
Jika ini file yang lebih besar, ketika Anda menjalankan perintah, yang Anda dapatkan adalah tidak ada output selama beberapa detik atau bahkan menit saat sedang bekerja. Anda dapat memperbaikinya dengan menambahkan -vflag ( mode verbose ) yang mencantumkan nama setiap file saat diekstrak.
IQAndreas
Jika Anda mengalami masalah dengan ini, perhatikan --strip-components=1saran dari jawaban lain juga.
DreadPirateShawn
9
@consultstan xkcd.com/1168
Duncan X Simpson
9
Bukankah menakjubkan bahwa, setelah bertahun-tahun ini, dengan semua opsi tartelah terakumulasi, masih belum ada opsi untuk membuat direktori output jika tidak ada ?
EM0
261

Perhatikan bahwa jika tarball Anda sudah berisi nama direktori yang ingin Anda ubah, tambahkan --strip-components=1opsi:

tar xf archive.tar -C /target/directory --strip-components=1
Bryan Larsen
sumber
2
Terima kasih. Unduhan melalui wget / etc selalu memiliki direktori 'parent'. Ini adalah jawaban lengkap imo - atau harus dicatat dalam jawaban di atas.
bshea
Apa yang saya cari. --strip-componentssangat berguna saat menjalankan penyedia yang mungkin menggunakan versi yang berbeda. Cara ini /target/directorybisa berupa nama umum, tanpa harus khawatir tentang bagaimana penyedia memilih untuk memberi nama folder arsip mereka.
Jack_Hu
30

Menggabungkan jawaban dan komentar sebelumnya:

Untuk hanya mengekstrak konten dan membuat direktori target jika tidak ada:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Untuk mengekstrak dan juga menghapus direktori root (tingkat pertama) di zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1
Thamme Gowda
sumber
20

Pilihan lain adalah menggunakan --one-top-level. Ini secara otomatis akan membuat direktori berdasarkan nama file aslinya.

tar zxvf filename.tgz --one-top-level

Selain itu jika Anda mau, Anda bisa menentukan sendiri dan tar akan membuatnya secara otomatis.

tar zxvf filename.tgz --one-top-level=new_directory
Householder Dekan
sumber
3
Saya menggunakan GNU tar 1.26 dan saya mendapatkan opsi error yang tidak dikenal untuk--one-top-level
Emma Strubell
Ini jawaban yang saya butuhkan. Sangat berguna "tidak" harus menentukan nama direktori, atau ingat kode khusus yang akan merujuk kembali ke file untuk nama tersebut. Terima kasih.
Hypocritus
2

Apa yang saya temukan menarik dalam kaitannya dengan ekstraksi adalah, itu tergantung bagaimana Anda membuat arsip, lihat contoh ini

cd /tmp
mkdir folder
touch folder/file.txt

ketika Anda melakukan tar -zcvf folder.tar.gz foldersemuanya seperti yang diharapkan = ketika Anda membuka untar sekarang akan dibatalkan (folder akan dibuat, jika Anda menghapusnya) sebagai /tmp/folder/.

Tapi, ketika Anda akan membuat tar sebagai tar -zcvf tmp-folder.tar.gz /tmp/folderdan Anda untar di folder / tmp, hasilnya adalah /tmp/tmp/folderdirektori! Jika demikian, Anda harus melepaskannya ke / -tar -xf tmp-folder.tar.gz -C /

Betlista
sumber
1

Dengan tar 1.29, kita bisa menambahkan nama direktori setelah nama file tar. Misalnya,

tar zxvf tar-file directory-name/
Shunmuga priyan Selvaraju
sumber