Yanıtlar:
cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd -
işi bir satırda yapmalı. Gizli dosyalar için de iyi çalışır. "*" gizli dosyaları en azından bash'ta yol adı genişletmesiyle genişletmez. Aşağıda benim denemem:
$ mkdir my_directory
$ touch my_directory/file1
$ touch my_directory/file2
$ touch my_directory/.hiddenfile1
$ touch my_directory/.hiddenfile2
$ cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd ..
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2
$ tar ztf my_dir.tgz
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2
.
ile değiştirirseniz , *
o cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd ..
zaman beklediğiniz gibi çalışacaktır.
$ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
cd
dizinlere girip çıkmak oldukça topal. En azından kullanmak olabilir pushd
ve popd
eğer tar
gibi bayrakları yoktu -C
.
-C
Katran anahtarını kullanın :
tar -czvf my_directory.tar.gz -C my_directory .
-C my_directory
İçin geçerli dizini değiştirmek için tar söyler my_directory
ve sonra .
(gizli dosyalar ve alt dizinleri dahil) "tüm geçerli dizin eklemek" anlamına gelir.
Bunu -C my_directory
yapmadan önce yaptığınızdan emin olun yoksa .
dosyaları geçerli dizine alırsınız.
tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a
" apl.jhu.edu/Misc/Unix-info/tar/tar_65.html Her zaman denerim tar -czvf my_directory.tar.gz * -C my_directory
ve Bu çalışmıyor. -C
konumu önemlidir! Kahretsin tar ...
*
gizli dosyalar (orijinal gereksinim olan) içermeyeceğini unutmayın .
Ayrıca her zamanki gibi arşiv oluşturabilir ve aşağıdakilerle ayıklayabilirsiniz:
tar --strip-components 1 -xvf my_directory.tar.gz
--strip-components
bir GNU uzantısı olduğunu unutmayın.
Göz at --transform
/ ' --xform
dosya arşive eklendiğinde olarak, bu size dosya adını masaj fırsatı verir:
% mkdir my_directory
% touch my_directory/file1
% touch my_directory/file2
% touch my_directory/.hiddenfile1
% touch my_directory/.hiddenfile2
% tar -v -c -f my_dir.tgz --xform='s,my_directory/,,' $(find my_directory -type f)
my_directory/file2
my_directory/.hiddenfile1
my_directory/.hiddenfile2
my_directory/file1
% tar -t -f my_dir.tgz
file2
.hiddenfile1
.hiddenfile2
file1
Dönüşüm ifadesi ile benzerdir sed
ve /
( ,
yukarıdaki örnekte) dışında ayırıcılar kullanabiliriz .
https://www.gnu.org/software/tar/manual/html_section/tar_52.html
file list too long
. Benim çözümüm bunu önlüyor ve daha esnek.
--xform
birden çok yol için birden çok kez geçebilirsiniz .
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Bazı durumlarda (yalnızca dosyaları, dizinleri ve sembolik bağlantıları arşivleyin):
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Aşağıdaki maalesef ./
arşivde bir üst dizin içeriyor :
tar -czf mydir.tgz -C /my/dir .
--transform
Yapılandırma seçeneğini kullanarak tüm dosyaları bu dizinin dışına taşıyabilirsiniz , ancak bu .
dizinin kendisinden kurtulamaz . Komuta uymak gittikçe zorlaşıyor.
$(find ...)
Komuta bir dosya listesi eklemek için kullanabilirsiniz ( magnus'un cevabında olduğu gibi ), ancak bu muhtemelen bir "dosya listesi çok uzun" hatasına neden olabilir. En iyi yol, katran -T
seçeneği ile birleştirmektir , örneğin:
find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Temel olarak , dizininizin altındaki tüm dosyaları ( -type f
), links ( -type l
) ve alt dizinleri ( -type d
) listeler , tüm dosya adlarını göreceli olarak kullanarak yapar -printf "%P\n"
ve daha sonra tar komutuna iletir (STDIN kullanarak dosya adlarını alır -T -
). -C
Seçeneği göreli adlarla dosyalarının bulunduğu katran bilmesi için gereklidir. --no-recursion
Bu tar o (çift dosyaları neden olan) arşive anlatılıyor klasörler halinde recurse gelmez yüzden bayrağıdır.
Dosya adları ile özel bir şey yapmanız gerekiyorsa (filtreleme, sembolik bağlantıları izleme vb.), find
Komut oldukça güçlüdür ve tar
yukarıdaki komutun bir kısmını kaldırarak test edebilirsiniz :
$ find /my/dir/ -printf "%P\n" -type f -o -type l -o -type d
> textfile.txt
> documentation.pdf
> subfolder2
> subfolder
> subfolder/.gitignore
Örneğin, PDF dosyalarını filtrelemek istiyorsanız, ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Komut , sonuçlarını göreli yollarla yazdırmayı söyleyen printf
(GNU'da bulunur find
) kullanır find
. Ancak, GNU'nuz yoksa find
, bu yolları göreli hale getirir (ebeveynleri ile birlikte kaldırır sed
):
find /my/dir/ -type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Bu cevap çoğu durumda işe yarar. Dosya isimleri, örneğin, olduğu gibi katran dosyada saklanır nasıl Ancak dikkat edin ./file1
yerine sadece daha file1
. BuildRoot paket dosyaları olarak kullanılan tarballs manipüle etmek için bu yöntemi kullanırken bu sorunlara neden olduğunu buldum .
Bir çözüm, bunun dışındaki tüm dosyaları listelemek için bazı Bash glob'larını kullanmaktır ..
:
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
Bu cevaptan öğrendiğim bir numara .
Eşleşen dosya yoksa artık tar bir hata döndürür ..?*
veya .[^.]*
yine de çalışır. Hata bir sorunsa (bir komut dosyasında başarılı olup olmadığını kontrol ediyorsanız), bu işe yarar:
shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob
Şimdi kabuk seçenekleriyle uğraşmamıza rağmen, sahip olmanın daha temiz olduğuna karar verebiliriz *
gizli dosyalarla eşleşmenin :
shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob
Bu *
, geçerli dizindeki kabuk kürelerinizin bulunduğu yerde çalışmayabilir , bu nedenle alternatif olarak şunları kullanın:
shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob
tar: start.sh: Cannot stat: No such file or directory
. Bundan nasıl kaçınırım?
Ben aşağıdaki Bash işlevi öneriyoruz (ilk argüman dir yolu, ikinci argüman elde edilen arşiv temel adıdır):
function tar_dir_contents ()
{
local DIRPATH="$1"
local TARARCH="$2.tar.gz"
local ORGIFS="$IFS"
IFS=$'\n'
tar -C "$DIRPATH" -czf "$TARARCH" $( ls -a "$DIRPATH" | grep -v '\(^\.$\)\|\(^\.\.$\)' )
IFS="$ORGIFS"
}
Bu şekilde çalıştırabilirsiniz:
$ tar_dir_contents /path/to/some/dir my_archive
ve my_archive.tar.gz
mevcut dizin içinde arşivi oluşturur . Gizli (. *) Öğelerle ve dosya adlarında boşluk bulunan öğelerle çalışır.
cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..
Bu benim için çalıştı ve tüm dosyaları "." Adlı bir kök dizine koymadan tüm gizli dosyaları içerir. gibi Tomoe cevabı :
İşte benim işime yarayan bu.
tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -maxdepth 1 -printf '%P ')
Ayrıca kullanabilirsiniz
tar -cvf my_dir.tar.gz -C /my_dir/ $(find /my_dir/ -mindepth 1 -maxdepth 1 -printf '%P ')
İlk komutta find , my_dir dosya ve alt dizinlerinin listesini döndürür . Ancak, my_dir dizininin kendisi bu listeye '.' -printf parametre de dahil olmak üzere tam yolu kaldırır. '' ve ayrıca hepsicrlf Ancak Uzaybiçim dizesi içinde '% P' arasında printf bir dosya ve alt dizinleri listesinde kalan yaprakların my_dir ve sonucu lider boşlukla görülebilir bulmak komutu.
Bu TAR için bir sorun olmayacak, ancak bunu düzeltmek istiyorsanız , ikinci komutta olduğu gibi -mindepth 1 ekleyin .
Kişi kullanın.
Pax, kullanımdan kaldırılmış bir paket ancak işi mükemmel ve basit bir şekilde yapıyor.
pax -w > mydir.tar mydir
# tar all files within and deeper in a given directory
# with no prefixes ( neither <directory>/ nor ./ )
# parameters: <source directory> <target archive file>
function tar_all_in_dir {
{ cd "$1" && find -type f -print0; } \
| cut --zero-terminated --characters=3- \
| tar --create --file="$2" --directory="$1" --null --files-from=-
}
Dosya adlarını boşluk veya diğer olağandışı karakterlerle güvenle işler. İsteğe bağlı -name '*.sql'
olarak, dahil edilen dosyaları sınırlamak için find komutuna bir veya benzer bir filtre ekleyebilirsiniz .
tar -cvzf tarlearn.tar.gz --remove-files mytemp/*
Klasör mytemp ise, yukarıdakini uygularsanız klasördeki tüm dosyaları sıkıştırır ve kaldırır, ancak yalnız bırakır
tar -cvzf tarlearn.tar.gz --remove-files --exclude='*12_2008*' --no-recursion mytemp/*
Hariç tutma kalıpları verebilir ve ayrıca alt klasörlere bakmamayı da belirtebilirsiniz
tar -czf
mu? Benim durumumda sadece dosyaları saklıyor, dizini değil. Ben sadecetar
dizin içerir amatar -czf
onunla sadece dosyaları ekliyor.