Tüm 'dotfiles' dahil olmak üzere tüm alt dizinleri ve / wo dizin yapısını hariç tutarak tar kullanarak arşiv oluşturma


18

Tar.zshrc ile ev dizinin altındaki tüm 'dotfiles' (fe ) 'yi yedeklemek istiyorum , ancak dizin yapısı ve tüm alt dizinler hariç.

Birkaç kez farklı komutlarla denedim, ancak elde ettiğim en iyisi gizli dizinleri de içeren bir arşivdi $HOME.

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

findSonucu katran olarak kullanmayı ve borulamayı da düşündüm , ama hiç şansım yoktu. Birisi bu - görünüşte kolay - görevi nasıl başaracağını biliyor mu?

PS: Çoğu zaman bir arşiv oluşturmak için tar kullandığımda, xkcd comic hakkında düşünmek zorundayım:

xkcd 1168 :)


Sim'in cevabı işe yarıyor, ancak birisi sadece gizli dosyalarla eşleşen bir regex'e sahipse, lütfen gönderin!
klingt.net

1
Elbette bu, kabuğunuzla daha iyi elde edilebilir. O zsh sadece dosyaları seçmek globs olduğunu anlıyorum - *(.)- ve bunu dışlayan düşünüyorum .ve ..gelen .*varsayılan olarak (ve onlar tarafından alınmayı olmaz .*(.)sadece dosyaları seçer, çünkü zaten). Kendimi zsh kullanmıyorum, bu yüzden bunu bir cevaba dönüştürecek kadar emin değilim.
evilsoup

Yanıtlar:


14

Dizininizdeki tüm dotfiles ( .<something>) öğelerinizi yedeklemek için bu komutu kullanabilirsiniz $HOME:

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

regex sadece tar kullanarak?

Yöntem 1

Bunu biraz araştırdım ve boş geldim. Sınırlayıcı faktör, bunu targerçekleştirirken hariç tutulduğunda , /dizinlerle gösterilen izleyen eğik çizgi ( ), katranın desen eşleşmesini gerçekleştirirken denklemin bir parçası olmamasıdır.

İşte bir örnek:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

Bu varyant bir hariç tutma içerir .*/ve tar'a açık ayrıntılı anahtarla -vbu dizinlerin bu hariç tutmadan geçtiğini görebilirsiniz.

yöntem # 2

Belki anahtarları düşündüm --no-wildcards-match-slashya --wildcards-match-slashda açgözlülüğü rahatlatacaktı .*/ama bunun da bir etkisi yoktu.

Eğik çizgiyi dışlamadan çıkarmak, .*bir seçenek değildi, çünkü bu, tartüm dotfiles ve dotdirectories'i hariç tutmayı söyleyecektir :

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

yöntem # 3 (Çirkin!)

Bu yüzden kavrayabildiğim tek alternatif, dosyaların bir listesini sağlamaktır tar. Bunun gibi bir şey:

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

Dosya sayısı, bir komuta argüman iletmek için maksimum alan miktarını aşarsa, bu yaklaşımın sorunları vardır göze çarpan bir sorun. Diğeri, çirkin ve aşırı derecede karmaşık olmasıdır.

yani? Ne Öğrendik?

tarDüzenli ifadeleri kullanarak bunu başarmanın basit ve zarif bir yolu yoktur . @ Terdon'un yorumuna gelince, bunu yapmanın en find ... | tar ...uygun yolu gerçekten.


Gerçekten bunu yapmak istedim regex, ama bu şekilde çalışmayacağını
bilmeliydim

@ klingt.net - mümkün olmalı, şimdi bakıyorum.
slm

@ klingt.net neden daha karmaşık yolu tercih edersiniz? Kullanmak regexmuhtemelen önde gelen nokta kaçmak gerekir ve görmezden sorun olacak .ve ... Eminim slm muhtemelen gösterecektir gibi ama neden değerli olacağını anlamıyorum.
terdon

1
@ klingt.net - findKomutun bulduğu her şey argüman olarak aktarılır tar. Bu {}sonuçların ilgili -execkomuta girmesini istediğiniz yer . +Birçok sonuçlarına olarak eklemek diyor findkomut satırında sığacak ve arayacak şekilde taryerine bir sonuç bulunursa her zamandan daha kez sadece birkaç.
slm

1
@ klingt.net - kullanarak bunu yapmanın bir yolu yoktur regexve tar(nokta dizinleri izole etmek yolu yoktur çünkü .blah/). Tar, hariç tutmayı yaparken sondaki eğik çizgiyi kullanmaz.
slm

4

Eşleşen dosyalar üzerinde bu tür bir kontrol, tar'ın konfor bölgesinin çok dışındadır. Dosya eşleme kuralları, adlar üzerindeki basit eşleşmelerle sınırlıdır.

find bir yoludur, ancak zsh'a sahip olduğunuz için daha kolay:

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

Yani .joker ifadenin sonuna parantez içinde bir olan topak eleme “sadece normal dosyaları maç” diyor.

Normal dosyalara sembolik bağlantılar eşleştirilmez. Olarak değiştirirseniz .*(-.)bunlar dahil edilir, ancak dosya dahil edilmedikçe arşivde son bulmaz. Sembolik bağlantıyı hedefleriyle değiştirmek istiyorsanız, bunu yapın .*(-.:A)-  sembolik bağlantıları kullanmayan bir yola tüm sembolik bağlantıları çözümleyen geçmiş genişletme değiştiricisini:A ekler .


3

Bu cevap slm tabanlı, ama ben de ile başlayan dizinleri dahil nasıl göstereceğim .

Ana dizininizdeki nokta dosyalarını sıkıştırmak için:

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

Dizin eklemek için:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

?Birinci komuta isteğe bağlıdır, ancak ikinci, aksi değil findiçerecektir .(akım) dizini.


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.