it-swarm-id.com

Cara memilih nama direktori selama pembatalan

Katakanlah saya memiliki file bernama ugly_name.tar, yang ketika diekstraksi, menjadi ugly_name direktori. Perintah apa yang bisa saya gunakan sehingga nama direktori yang dihasilkan adalah pretty_name sebagai gantinya?

132
tshepang

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 tar BSD memiliki --strip-components pilihan, 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
187
Mat

Dengan GNU tar ≥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 adalah 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 sebagai gantinya.

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

Dengan pax , utilitas arsip POSIX, gunakan -s option, yang menggunakan ekspresi pengganti sed-like 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!'

Cara paling sederhana

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
11
marquicus

Gunakan ini :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

Dari askUbuntu, ini jawaban bekerja 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-compress .


Memperbarui

Seperti yang ditunjukkan dalam komentar , metode ini tidak berfungsi untuk arsip yang dibentuk dengan benar, namun seperti jawaban lain menunjukkan, Anda harus menambahkan --strip-components 1 agar ini benar-benar berfungsi. Saya telah menguji dengan opsi baru ini dan itu berfungsi baik untuk arsip dengan nama tingkat atas dan yang tidak.

3
smac89