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.