katran özü aynı taban adıyla dizine?


18

Gibi sıkıştırılmış bir dosyam var myArchive123.tar.gz . İçinde aşağıdaki gibi bir klasör var:helloWorld

Çıkarırsam: Klasörü tar -xf myArchive123.tar.gzalıyorum helloWorld:

ls 
myArchive123.tar.gz
helloWorld 

Çıktı dosya adı eksi .tar.gz uzantısıyla aynı ad olmasını istiyorum. yani:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

Bu yapılabilir mi?

  • Arşivin içinde ne olduğunu asla bilemiyorum. Bir klasör olabilir, birçok dosya olabilir.
  • Katran yapamazsa başka bir araç kullanmakta sorun olmaz.
  • Bir betiğe dönüştürülebilen daha uzun bir formla iyi olurdum

EDIT
Bu arada işimi bitirmiş gibi görünen bir senaryoyu kendime hackledim. (aşağıdaki cevapladığım cevaba bakınız). Geliştirilebilirse, lütfen yorum / ek cevap göndermekten çekinmeyin. Ana şey, aşağıdaki gibi bir astar içine paketlenebilmesidir:

extract <file>

1
Arşiv her zaman tam olarak bir klasör içeriyor mu?
— Mark Plotnick


Çıkarma sırasında içinde ne olduğunu bilmiyorum. Bu, arşivin içinde ne olduğuna da bağlı olmamalıdır. Bu bir klasörse, oradaki klasörü çıkarın. bir dosyaysa, tüm dosyaları çıkarın.
— Leo Ufimtsev

Bu arada bir senaryoyu bir araya getirdim (aşağıya bakınız). Cevabı sadece 2 gün içinde kabul edebilirim.
— Leo Ufimtsev

Arşiv en üst düzeyde birden fazla klasör içerecek mi?
— Mark Plotnick

Yanıtlar:


10

İle her dosya adının başına eklemek için (veya ) gnu tarkullanabilirsiniz :--xform--transform/prefix/

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

Not hiçbir orada götürüyor /içinde prefix/ve sedbirlikte ifade uçları Sdosya adı dönüşümler gelen sembolik bağlantı hedefleri dışlamak için.
Test etmek için (kuru çalışma):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

Başlamak için, şu şekilde çağırabileceğiniz çok basit bir komut dosyası extract <file>:

STRIP = $ {% 1. *} # Şerit son eki
NAME = Varsa , $ {STRIP% .tar} #strip .tar soneki
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" #run komutu

Bu, istediğim şeye yakın, ancak bunun gibi bir şeye paketleyebilmem dışında: extract <file>
— Leo Ufimtsev

Bu adamcağız, ilk noktada duruyor. Örneğin böyle bir dosyam var: eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz .tar.gz olmadan bir çıktı bekliyorum, ama eclipse-sdk-4
— Leo Ufimtsev

Yukarıdaki komut dosyasında, uzantıyı kaldırıyorum ve bir 'katran' bulursam daha fazla bantlıyorum.
— Leo Ufimtsev

Genel olarak, birçok arşiv türü ile. Hızlı bir tek hat bekliyordum, belki bazı argüman bayraklarını kaçırdığımı düşündüm. Ama görünüşe göre bunun önemsiz bir çözümü yok mu?
— Leo Ufimtsev

İyi şeyler. Bu çalışıyor ve yazdığım senaryodan daha kısa. Güzel!
— Leo Ufimtsev

7

En azından birkaç adımda yapabilirsin. Eğer yaptıysan

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

ancak görevi daha kompakt bir şekilde cevaplayabiliriz.


3

Düzenle

Kabul edilen cevap aşağıdakilerden daha kısadır. (aynı şeyi yapın, ancak daha kısa genellikle daha iyidir).


Sonunda elimdeki görev için bir senaryo hackledim. .tar .tar.gz ve .gz ile çalışır

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

Kullanımı:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

Bu çözümün bir dosya adında nokta yapabileceğini unutmayın. Eclipse-4.5M-SDK.tar.gz.

Senaryoyu git repo'mda tutuyorum. En son sürüm için bkz. Https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

Olası bir çözüm daha --transformseçeneği kullanmaktır :

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

Dosyalarınızla:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
ancak bu, arşivin içinde ne olduğunu bildiğinizi varsayar
— Leo Ufimtsev

örneğin, arşivde ne olduğunu bilmeden bunu tek satırlık bir komut dosyasına nasıl dönüştürürüm?
— Leo Ufimtsev

Haklısın. Burada yazdığım gibi sadece bir olası çözüm ...
— svq

ve --strip-compoments = 0 myArchive123 arasında herhangi bir fark var mı?
— Leo Ufimtsev

1
Ve --strip-components=0sadece ilk dizin adını yoldan kaldırır ve -Cseçenek ile arşivlenmemiş dosyaları yeni dizine kaydeder.
— svq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.