Jawaban:
Ini seharusnya bekerja:
mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
-C
perubahan ke direktori yang ditentukan sebelum membongkar (atau mengemas). --strip-components
menghapus jumlah direktori yang ditentukan dari nama file yang disimpan dalam arsip.
Perhatikan bahwa ini tidak benar-benar portabel. GNU tar dan setidaknya beberapa tars BSD memiliki --strip-components
opsi, tetapi tampaknya tidak ada pada platform mirip-unix lainnya.
Cara bodoh melakukan ini akan bekerja cukup banyak di mana-mana.
tar xf ugly_name.tar && mv ugly_name pretty_name
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
direktori. Ngomong-ngomong, kecantikan ada di mata yang melihatnya.
Dengan tar GNU ≥1.16, gunakan --transform
untuk menerapkan transformasi sed regexp ke setiap nama file (transformasi diterapkan pada path lengkap dalam arsip):
tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Jika ugly_name
komponen tingkat atas dari semua nama file dalam arsip, Anda tidak perlu repot dengan pencocokan tepat:
tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Jika Anda tidak tahu nama direktori tingkat atas, Anda masih dapat menggunakan metode ini, meskipun Anda mungkin lebih suka --strip-components
.
tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'
Dengan pax
, utilitas arsip POSIX, gunakan -s
opsi, yang menggunakan ekspresi pengganti seperti sed sebagai argumen.
pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'
Gunakan ini :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
operator daftar di antara dua perintah itu, jadi yang kedua hanya dijalankan jika yang pertama berhasil.
ugly_name
sudah ada.
Cara paling sederhana
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
tanpa --strip-components 1
. (2) Sebaliknya, jawaban yang diterima (diposting oleh Mat) fitur --strip-components 1
tanpa --one-top-level=pretty_name
. (3) Dapatkah Anda menjelaskan mengapa jawaban Anda, menggabungkan pilihan-pilihan ini, lebih baik daripada yang sebelumnya? Tolong jangan menanggapi dalam komentar; edit jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap.
--strip-component 1
diperlukan, dengan metode mkdir
atau --strip-components 1
, jika tidak, Anda hanya mendapatkannya pretty_name/ugly_name/
.
Dari askUbuntu, jawaban ini berhasil untuk saya:
tar zxvf ugly_name.tgz --one-top-level=pretty_name
`--satu tingkat atas [= dir] '
Memberitahu tar untuk membuat direktori baru di bawah direktori ekstraksi (atau yang diteruskan ke `-C ') dan menggunakannya untuk menjaga terhadap tarbombs. Dengan tidak adanya argumen dir, nama direktori baru akan sama dengan nama dasar arsip (nama file dikurangi akhiran arsip, jika dikenali). Setiap nama anggota yang tidak dimulai dengan nama direktori itu (setelah transformasi dari `--transformasi 'dan` --strip-komponen') akan diawali dengan itu. Sufiks nama file yang dikenali adalah `.tar ', dan sufiks kompresi apa pun yang dikenali oleh See -auto-kompres .
Seperti yang ditunjukkan dalam komentar , metode ini tidak berfungsi untuk arsip yang dibentuk dengan benar, namun seperti yang ditunjukkan oleh jawaban lain , Anda harus menambahkan --strip-components 1
ini agar benar-benar berfungsi. Saya telah menguji dengan opsi baru ini dan itu berfungsi baik untuk arsip dengan nama tingkat atas dan yang tidak.
pretty_name
, dengan direktori tingkat atas asli di dalamnya. Misalnya jika tar xzf ugly_name.tgz
akan membuat direktori bernama ugly_name/
, maka perintah yang Anda berikan akan dibuat pretty_name/ugly_name/
.