buka paket 'tar' tetapi ubah nama direktori untuk diekstraksi

26
tar -tf filename.tar
folder1/file
folder1/name
[...]

Saya ingin mengekstrak file dan nama , folder2 . Apakah ini dapat dilakukan sebagai one-liner?

Felipe Alvarez
sumber

Jawaban:

35

Gunakan -Cdan --strip-components(Lihat man tar).

Contoh:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Penjelasan:

The -Cbendera mengasumsikan direktori sudah di tempat sehingga isi dari file tar dapat diperluas ke dalamnya. karenanya mkdir FOLDER.

The --strip-componentsflag digunakan ketika sebuah file tar secara alami akan memperluas dirinya menjadi sebuah folder, biarkan katakanlah, seperti github mana contoh untuk repo-name-masterfolder. Tentu saja Anda tidak memerlukan folder level pertama yang dibuat di sini, jadi --strip-componentssetel 1akan secara otomatis menghapus folder pertama itu untuk Anda. Semakin besar angkanya, semakin banyak folder bersarang yang dihapus.

Marian
sumber
Saya baca man tar. Tidak menemukan --strip-components. bagus
Felipe Alvarez
1
tar-1.14 menggunakan --strip-path, tar-1.14.90 + menggunakan --strip-components. Mungkin ada masalah di sini?
Mikhail Moskalev
Saya akan membenarkan ini jika memberikan contoh dan bukan hanya sakelar, seperti yang dinyatakan dalam manual online , 3 gaya argumen menimbulkan kebingungan.
Iain
Lupa -f pada tar -xz, pikirku. Gagal bagiku. Saya pikir saya telah menggunakan itu tanpa alasan selama ini ...
John Carrell
17

Anda juga dapat menggunakan --transformopsi ini untuk sedikit lebih fleksibel. Ia menerima operasi penggantian pengganti apa pun.

Sebagai contoh, ini adalah bagaimana saya mengekstrak tarbal Linux ke direktori baru sehingga saya bisa menerapkan tambalan:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
Tom
sumber