'Tar' komutunu kullanarak dosyaları başka bir dizine nasıl çıkartırım?


672

tar archive.tar /users/mylocationİşe yarayacağını düşündüm , ama işe yaramadı. Bunu nasıl yapabilirim?


1
Ayrıca, -C, --directory DIR\n change to directory DIRbunun yerine tanımlanmalıdır change output directory to DIR (will fail if DIR doesn't exist). @Mich teşekkürler. Ayrıca bkz. @ Bryan_Larsen'in cevabı.
geçerli olan

1
@Ujjwal Sing: Gerçekten de, tar adam sayfası o kadar da yardımcı değil. "-C DIR" ı "DIR dizinine değiştir" olarak tanımlar. Daha da kötüsü: "tar -C mydir xf archive.tar" çalışmaz, "tar xf archive.tar -C mydir" çalışmaz.
Pat Morin

@PatMorin Adil olmak gerekirse, kullandığınız argüman çağrıları kurallarını anladığınızda bir anlam ifade eder. Ayrıca yapabilirsiniz tar xfC archive.tar mydirveya tar -C mydir -xf archive.tar. Sadece bir şeyleri kıran geleneksel tarzı ve GNU tarzı bayraklarını karıştırmak, dürüstçe beklenen bir şey. Geleneksel bayraklar, ilk argüman olarak bir blok kadar geçirilir. İlk değillerse çalışmalarını bekleyemezsiniz. (Yani, evet, yine de yorumlamak mümkün - demek istediğim standart değil yukarıda ve öteye
gidecekti

Yanıtlar:


958

Bir arşivi geçerli olandan farklı bir dizine çıkarmak için -C, veya gibi --directory, tar seçeneğini kullanın.

tar -xf archive.tar -C /target/directory

Hedef dizinin, bu komutu çalıştırmadan önce var olması gerektiğini unutmayın (tarafından oluşturulabilir mkdir /target/directory).

Diğer seçenekler için kılavuz sayfasını (komut:) okuyun man tar.



3
Daha büyük bir dosyaysa, komutu çalıştırdığınızda, aldığınız tek şey çalışırken birkaç saniye, hatta dakikalarca çıktı alınmaz. Bunu, her dosyanın adını çıkardıkça listeleyen -vbayrağı ( ayrıntılı mod ) ekleyerek düzeltebilirsiniz .
IQAndreas

Bu konuda sorun yaşıyorsanız --strip-components=1, diğer cevabın tavsiyelerine de dikkat edin .
DreadPirateShawn


9
Tüm bu yıllar sonra, tüm seçeneklerin tarbirikmesiyle, mevcut değilse , çıktı dizinini oluşturma seçeneği bulunmaması şaşırtıcı değil mi?
EM0

260

Tarball'ınız zaten değiştirmek istediğiniz bir dizin adı içeriyorsa, --strip-components=1seçeneği ekleyin :

tar xf archive.tar -C /target/directory --strip-components=1

2
Teşekkür ederim. Wget / etc aracılığı ile yapılan indirmeler her zaman bir 'ana' dizine sahiptir. Bu tam cevap imo - ya da yukarıdaki cevaba not edilmelidir.
bshea

Tam da aradığım şey. --strip-componentsFarklı sürümleri kullanabilecek sağlayıcıları çalıştırırken çok kullanışlıdır. Bu /target/directory, sağlayıcının arşiv klasörünü nasıl adlandırmayı seçtiği konusunda endişelenmenize gerek kalmadan genel bir ad olabilir.
Jack_Hu

30

Önceki cevapları ve yorumları birleştirerek:

İçeriği kolayca ayıklamak ve eksikse hedef dizin oluşturmak için:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Zip içindeki kök (birinci seviye) dizini çıkartıp çıkarmak

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

Başka bir seçenek kullanmaktır - bir üst seviye. Bu, orijinalin dosya adına göre otomatik olarak bir dizin oluşturur.

tar zxvf filename.tgz --one-top-level

Ek olarak, isterseniz kendi kodunuzu belirleyebilirsiniz ve tar otomatik olarak yaratacaktır.

tar zxvf filename.tgz --one-top-level=new_directory

3
GNU tar 1.26 kullanıyorum ve tanınmayan bir seçenek hatası alıyorum--one-top-level
Emma Strubell

İhtiyacım olan cevap bu. Çok yararlı "değil" dizin adını belirtmek zorunda veya adı için dosyaya geri dönecek özel kodu hatırlamak. Teşekkür ederim.
Hypocritus

2

Çıkartma ile ilgili ilginç bulduğum şey, arşivi nasıl yarattığınıza bağlı, bu örneği görün.

cd /tmp
mkdir folder
touch folder/file.txt

tar -zcvf folder.tar.gz folderherşeyi yaptığınız gibi beklendiği gibi = başlattığınızda şimdi kaldırılmayacak (klasör kaldırılmışsa klasör oluşturulacak) /tmp/folder/.

Ancak, tar olarak tar -zcvf tmp-folder.tar.gz /tmp/folderas'ı yaratacağınız ve / tmp klasöründe açacağınız zaman, sonuç /tmp/tmp/folderdizin olacaktır ! Bu durumda / - ile kaldırmanız gerekirtar -xf tmp-folder.tar.gz -C /


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.