Zahralık: Rsync kullanarak yedek alan bir betik

Başlatan if, 22 Mayıs 2014 - 00:18:58

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

if

zahralik, rsync temelli birikimli yedekleme yapan bir BASH betiğidir. zahralık ilk çalıştırıldığında seçilen dizinleri normal bir şekilde yedekleyecektir. Daha sonraki yürütümlerde gemişte alınan yedek dizinlerden değişmeyenleri yeni yedeğe sabit bağ olarak, değişenleri ise sadece değişen kısımlarını yedekleyecektir. Dilendiği takdirde yedeği GPG anahtarınız ile şifreleyebilirsiniz.

zahralik, GNU GPLv3 Lisansı ile lisanslanmıştır. Bu lisans size

0: Programı sınırsız kullanma,
1: Programın nasıl çalıştığını inceleme ve amaçlara uygun değiştirme,
2: Programın kopyalarını sınırsız dağıtma,
3: Programın değiştirilmiş halini dağıtma,

özgürlüklerini sunmaktadır.

Kullanmak İçin:

1- Depoyu yerelinize çekin:

git clone https://gitlab.com/numand/zahralik


2- Yerel depoya girin ve en azından zahralik.sh içindeki $hasat ve $ambar değişkenlerini değiştirin. elek.list içeriğini kendinize göre düzenleyebilirsiniz.

3- Betiğe çalıştırabilme bitini ekleyin ve çalıştırın.

chmod +x zahralih.sh
./zahralik.sh


Not: Sistem dosyalarını da yedeklemek istiyorsanız betiği sudo ile çalıştırın.

cagriemer

Ogretici bir betik olmus, eline saglik. Github'a koydugunun biraz gelismis hali sanirim bu.

if

#2
Teşekkür ederim @cagriemer. Senin gibi bir ustanın öğretici olarak addetmesi betiği, amacıma ulaştığımı gösterir. Github'dakinin aynısı betik. Eski halini hatırlıyorsundur. Biraz gelişti betik, adam oldu maşallah:)

jayw

Betiği henüz denemedim ama gerek betik içi açıklamalar açısından, gerekse değişken isimleri açısından betiğinizi çok beğendim :) Teşekkürler.

if

#4
Bir şey değil @jayw. Beğenmenize sevindim. Gördüğünüz herhangi bir hata olursa bildirirseniz sevinirim, ya da herhangi bir işlemin daha iyi yapılabilineceğini düşünüyorsanız.

cagriemer

Benim gozume carpan bir iki nokta var. Onlari paylasayim buradan, hep birlikte fikir yurutmus oluruz. Ilk olarak, betige hicbir tanim yapmayip hicbir arguman vermeden calistirdigimizda su satirlar yurutuluyor ve hata veriyor find.


gpgli=$(find "${ambar}" -name '*.gpg' -exec ls -t {} + | head -1 | awk -F'.' '{ print $2 }')
tarli=$(find "${ambar}" -name '*.bz2' -exec ls -t {} + | head -1 | awk -F'.' '{ print $2 }')


Bu kisimi ve ilgili bir iki isi son_zahrayi_bul gibi bir fonksiyon icerisine saklamak iyi olacaktir diye dusunuyorum.

Yine betige bir arguman vermeden ya da yanlis bir arguman vererek calistirdigimizda kullanim fonksiyonunu bastirmak iyi olacaktir. Bu is icin while getopts altindaki case blogunun sonuna su eklenebilir.


\?) echo -e "Gecersiz secenek" ; kullanim; exit 1 ;;


GPG kullanicisini sorduktan sonra tekrar bir sifreleme istiyor musunuz parametresi cok kullanici dostu degil sanki. Eger GPG ID tanimlanmissa sifreleme yapsin, tanimlanmamissa sifreleme yapmasin gibi bir cozume gidilebilir. Bu yapilirsa getopts'tan -k secenegi kaldirilabilir ve su anda test edemedigim icin calisir mi bilmiyorum ama denetle fonksiyonu suna benzer sekilde degistirilebilir.


denetle() {
echo -e "Degiskenler denetleniyor..."
   bosmudolumu=(ad hasat ambar birikimli anahtar secenekler sap_saman)
  for degisken in ${bosmudolumu[*]}; do
  if [[ $degisken != "ad" && "" == "${!degisken}" ]] ; then
  hata "Betik içinde ya da uçbirim üzerinde ${degisken} değişkenini belirtiniz!"
  fi
  if [[ $degisken == "ad" && "" != "${!ad}" ]] ; then
  sifrele="evet"
  fi
  done
}


Izinlerin ve ambarin kontrolu sanirim betigin en karmasik yeri olmus. Burada aslinda izin kontrolu de pek saglikli olmamis cunku ornegin 570 cagriemer:root diye bir ambar dizinim varsa 300'den buyuk oldugu icin yazabiliyorum sanacak fakat o dizine aslinda yazamayacagim.  Bunu sadelestirmek icin soyle bir onerim olacak. Yine dedigim gibi test etmedigim icin calisir mi bakmak lazim.



dizin_izin_denetle() {
        echo -e "${ambar} kontrol ediliyor..."
        izinli="hayir"
        if [[ -e "${ambar}" ]] ; then
        if [[ -w "${ambar}" ]] ; then
        izinli="evet"
        else
          hata "${ambar} dizini için gerekli izinlere sahip değilsiniz!
          chmod 755 -R ${ambar} komutunu deneyin."
        fi
        else
        echo -e "${ambar} dizini mevcut değil!"
        echo -ne "${ambar} dizini oluşturulsun mu? (e/h): "
        if [[ $REPLY == "e" ]] ; then
        if [[ -w $(dirname "${ambar}") ]]; then
        mkdir -p "${ambar}" # dizini oluştur
        else
        echo -e "izin yok"
        fi
          else
    echo -e "${ambar} dizini oluşturulmadan çıkılıyor."
                fi
  fi
}

if

Zaman ayırıp ilgilendiğin için teşekkür ederim @cagriemer.

Alıntı yapılan: cagriemer - 23 Mayıs 2014 - 10:06:03
Benim gozume carpan bir iki nokta var. Onlari paylasayim buradan, hep birlikte fikir yurutmus oluruz. Ilk olarak, betige hicbir tanim yapmayip hicbir arguman vermeden calistirdigimizda su satirlar yurutuluyor ve hata veriyor find.


gpgli=$(find "${ambar}" -name '*.gpg' -exec ls -t {} + | head -1 | awk -F'.' '{ print $2 }')
tarli=$(find "${ambar}" -name '*.bz2' -exec ls -t {} + | head -1 | awk -F'.' '{ print $2 }')


Bu kisimi ve ilgili bir iki isi son_zahrayi_bul gibi bir fonksiyon icerisine saklamak iyi olacaktir diye dusunuyorum.

Evet, bu kısmı da bir fonksiyon içine almak iyi olacak.


Alıntı yapılan: cagriemer - 23 Mayıs 2014 - 10:06:03
Yine betige bir arguman vermeden ya da yanlis bir arguman vererek calistirdigimizda kullanim fonksiyonunu bastirmak iyi olacaktir. Bu is icin while getopts altindaki case blogunun sonuna su eklenebilir.


\?) echo -e "Gecersiz secenek" ; kullanim; exit 1 ;;


Bunu düşünmemiştim. Söylediğin iyi oldu. Ekleyelim.


Alıntı yapılan: cagriemer - 23 Mayıs 2014 - 10:06:03
GPG kullanicisini sorduktan sonra tekrar bir sifreleme istiyor musunuz parametresi cok kullanici dostu degil sanki. Eger GPG ID tanimlanmissa sifreleme yapsin, tanimlanmamissa sifreleme yapmasin gibi bir cozume gidilebilir. Bu yapilirsa getopts'tan -k secenegi kaldirilabilir ve su anda test edemedigim icin calisir mi bilmiyorum ama denetle fonksiyonu suna benzer sekilde degistirilebilir.


denetle() {
echo -e "Degiskenler denetleniyor..."
   bosmudolumu=(ad hasat ambar birikimli anahtar secenekler sap_saman)
  for degisken in ${bosmudolumu[*]}; do
  if [[ $degisken != "ad" && "" == "${!degisken}" ]] ; then
  hata "Betik içinde ya da uçbirim üzerinde ${degisken} değişkenini belirtiniz!"
  fi
  if [[ $degisken == "ad" && "" != "${!ad}" ]] ; then
  sifrele="evet"
  fi
  done
}

$ad değişkeni varken $anahtar değişkenine ihtiyaç yok, bunu görememişim. Buna göre değiştirelim betiği.

Alıntı yapılan: cagriemer - 23 Mayıs 2014 - 10:06:03
Izinlerin ve ambarin kontrolu sanirim betigin en karmasik yeri olmus. Burada aslinda izin kontrolu de pek saglikli olmamis cunku ornegin 570 cagriemer:root diye bir ambar dizinim varsa 300'den buyuk oldugu icin yazabiliyorum sanacak fakat o dizine aslinda yazamayacagim.  Bunu sadelestirmek icin soyle bir onerim olacak. Yine dedigim gibi test etmedigim icin calisir mi bakmak lazim.



dizin_izin_denetle() {
        echo -e "${ambar} kontrol ediliyor..."
        izinli="hayir"
        if [[ -e "${ambar}" ]] ; then
        if [[ -w "${ambar}" ]] ; then
        izinli="evet"
        else
          hata "${ambar} dizini için gerekli izinlere sahip değilsiniz!
          chmod 755 -R ${ambar} komutunu deneyin."
        fi
        else
        echo -e "${ambar} dizini mevcut değil!"
        echo -ne "${ambar} dizini oluşturulsun mu? (e/h): "
        if [[ $REPLY == "e" ]] ; then
        if [[ -w $(dirname "${ambar}") ]]; then
        mkdir -p "${ambar}" # dizini oluştur
        else
        echo -e "izin yok"
        fi
          else
    echo -e "${ambar} dizini oluşturulmadan çıkılıyor."
                fi
  fi
}

Gösterdiğin gibi izinlere sahip bir dizinin olacağını düşünmemiştim. Her türlü duruma hazırlıklı olmak gerek olduğunu gösteriyor bu. -w testi sadece dizinin yazılabilir olduğuna bakıyor değil mi? Betiği hazırlarken önce -w kullanmıştım fakat şöyle bir durum var:
mkdir deneme
chmod 200 deneme
stat -L -c "%a %U %G" deneme
200 if users
ls -l
d-w------- 2 if users 4096 May 24 14:33 deneme
Şöyle bir betiğimiz olsun: #!/bin/bash
dizin="/home/if/deneme"
if [[ -e "${dizin}" ]]; then
if [[ -w "${dizin}" ]] ; then
  echo "İzinli."
else
  echo "İzinsiz."
fi
else
echo "Dizin yok."
fi

Çalıştırınca: ./izin.sh
İzinli.

Fakat: mkdir deneme/yedek
mkdir: `deneme/yedek' dizini oluşturulamıyor: Erişim engellendi
rsync -azq Belgeler/git deneme
rsync: change_dir#1 "/home/if//deneme/" failed: Permission denied (13)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(613) [Receiver=3.1.0]

rsync ve mkdir komutları yürütülemiyor. Şimdi chmod 300 deneme
mkdir deneme/yedek
rsync -azq Belgeler/git deneme
Bu yüzden 300 ve 30 deperlerini kullanmıştım. Yani sadece -w testi yetmiyor gibi. Acaba benim kaçırdığım bir nokta mı var?

İzin testini yapan fonksiyonu yazdıktan sonra bu fonksiyonla -izinvarmi() - $ambar dizininin mevcut olup olmadığını test eden fonksiyonu - ambarvarmi() - birleştirmek benim de aklıma gelmişti. izinvarmi() fonksiyonunu daha yeni ekledim. Vakit bulunca o işi de yaparım.

cagriemer

200 ornegi guzel olmus. Acaba bunu bir problem diye bildirebilir miyiz? Ya da bildirmisler midir? Bir dizin icerisine yazmak icin o dizinde calistirma iznimiz de olmasi gerekiyor. Herhalde inode degerini falan almak icin gerekiyor bu. O zaman BASH'teki testin bunu goz onunde bulundurmasi gerekmez mi? Bu izin konusunda biraz okuma yapayim ben.

if

Kırk yıllık -w testi için böyle bir durumun mevcut olduğunu sadece biz görmemişizdir diye düşündüm:) mkdir ve rsync'in nasıl çalıştığını inceliyordum ama henüz bir ipucuna ulaşmış değilim. inode değeri iyi bir tahmin @cagriemer. Düşününce -w testinin bunu göz önünde bulundurması gerek. Belki de gerçekten bir böcektir bu.

if


sem

Merhabalar arkadaşlar, öncelikle elinize sağlık.

200 sorunsalı içinse: burada dikkat etmemiz gereken iki konu var.

"Standart dosya" ve dizinler arasındaki izin farkı. Bir dosya için yani bir metin dosyası ya da ikilik dosya için (mesela müzik dosyası) iyeliğini 200 olarak ayarlarsak, betikteki kontrol işe yarar. if koşulunun -e kontrolüne göre bu bir bir dosyadır ve -w kontrolüne göre yazılabilirdir. Ve gerçekten bu dosyaya sadece sahibi yazabilir. Fakat burada önemli olan bunun bir dosa yani metin/ikilik anlamında bildiğiniz standart bir olması gerekli.


Aşağıdaki örnekte bunu görebiliriz. deneme_dosyası isminde bir dosya oluşturuluyor (standart bir dosya, dizin ya da soket vs değil). İzni 200 olarak değiştiriliyor. içerisine yazmaya çalışılıyor ve yazılıyor çünkü yazma iznim var. Sonra okumak istediğimda izin hatası alıyorum, ta ki root hakları ile yani sudo komutu ile okuyana kadar.


semetey@trusty:~/test$ touch deneme_dosyası
semetey@trusty:~/test$ chmod 200 deneme_dosyası
semetey@trusty:~/test$ echo "İzin denemesi" >> deneme_dosyası
semetey@trusty:~/test$ cat deneme_dosyası
cat: deneme_dosyası: Permission denied
semetey@trusty:~/test$ sudo cat deneme_dosyası
[sudo] password for semetey:
İzin denemesi


Standart bir dosya için (dizin, soket vs olmayan dosyalar) 200 tamamdır örnekte görüldüğü gibi.

Dizinlere gelince işler biraz karışıyor. Bildiğimiz gibi X hakkı executable'ın X'i yani dosyayı çalışabilir hale getirmek için kullanılıyor. Bir dosyayı çalıştırmak anlamlı fakat bir dizini çalıştırmak anlamlı olmuyor kavram olarak ama yine de dizinlere X hakkı verebiliyoruz. Dizinler için ne anlama geliyor X hakkı dersek, içinden geçme hakkı gibi düşünebiliriz.


semetey@trusty:~/test$ mkdir test_dizini_1
semetey@trusty:~/test$ mkdir test_dizini_1/test_dizini_2
semetey@trusty:~/test$ mkdir test_dizini_1/test_dizini_2/test_dizini_3
semetey@trusty:~/test$ echo "Deneme" >> test_dizini_1/test_dizini_2/test_dizini_3/standart_metin.txt


İç içe üç dizin yarattım ve en içteki dosya içinde bir tane de metin dosyası yarattım. İzinler aşağıdaki gibi:


semetey@trusty:~/test$ ls -lR
.:
total 4
drwxrwxr-x 3 semetey semetey 4096 Tem 26 11:03 test_dizini_1

./test_dizini_1:
total 4
drwxrwxr-x 3 semetey semetey 4096 Tem 26 11:03 test_dizini_2

./test_dizini_1/test_dizini_2:
total 4
drwxrwxr-x 2 semetey semetey 4096 Tem 26 11:03 test_dizini_3

./test_dizini_1/test_dizini_2/test_dizini_3:
total 4
-rw-rw-r-- 1 semetey semetey 7 Tem 26 11:03 standart_metin.txt


İzinleri değiştirince:


semetey@trusty:~/test$ chmod 200 test_dizini_1/test_dizini_2/test_dizini_3/standart_metin.txt
semetey@trusty:~/test$ chmod 200 test_dizini_1/test_dizini_2/test_dizini_3
semetey@trusty:~/test$ chmod 200 test_dizini_1/test_dizini_2
semetey@trusty:~/test$ chmod 200 test_dizini_1


ls atamıyorum çünkü dosyada okuma iznim yok sadece yazma iznim var.


semetey@trusty:~/test$ ls test_dizini_1
ls: cannot open directory test_dizini_1: Permission denied


x izni veriyorum ama ls atamıyorum çünkü r hakkım hala yok.


semetey@trusty:~/test$ chmod +x test_dizini_1
semetey@trusty:~/test$ ls test_dizini_1/
ls: cannot open directory test_dizini_1/: Permission denied


ls atamadığım halde dizin içerisinde bulunan başka bir dizine erişebiliyorum ve içteki diznin haklarını değiştrebiliyorum.


semetey@trusty:~/test$ chmod +x test_dizini_1/test_dizini_2
semetey@trusty:~/test$ chmod +x test_dizini_1/test_dizini_2/test_dizini_3


ls atamadığım izinlere sahip iç içe geçmiş dizinlerden bir dosyaya erişiyorum, ve dosyada bulunan 200 hakkımı kullanarak =) dosyaya yazıyorum ama dikkat ederseniz okumak için sudo kullanıyorum.


semetey@trusty:~/test$ echo "deneme" >> test_dizini_1/test_dizini_2/test_dizini_3/standart_metin.txt
semetey@trusty:~/test$ sudo cat test_dizini_1/test_dizini_2/test_dizini_3/standart_metin.txt
Deneme
deneme


Örneklerden şunu anlıyoruz bir dizinin içeriğine erişmek için yani örneğin ls komutu ile içeriğini görmek için r hakkına ihtiyacımız var. yukarıdaki ls komutlarından hata dönmüştü. Bir dizinin içeriğine erişmek istemesek de yani r hakkı istemesek de ya da ihtiyacımız olmasa da dizin içerisindeki dizine erişmek için dış dizin için x hakkına ihtiyacımız var.

Yani test_dizini_1 içerisinde bulunan test_dizini_2 dizinine erişebilmem için test_dizini_1 için x hakkına ihtiyacım var.

Anlaşılan o ki bir dizine yazmak için öncelikle o dizine girmemiz gerekiyor.

Yani 200 iyeliğine sahip bir dizinin kullanıcısı bu dizine yazma hakkına sahip yani -w parametresinin bu şekilde dönmesi normal. Çünkü evet yazma izni var. "Ama yazdığımızda neden hata alıyoruz o zaman" sorusunun cevabı X izninde. Yani biz aslında dosyaya yazarken değil, içine giderken hata alıyoruz. İçine girebilirsek dizine yazma hakkımız var. Bu nedenle -w kontrolü salt w hakkını kontrol ediyor ve doğru değeri dönüyor.

Standart dosya ile dizinin ayrımı var mı gerçekten sorusunun cevabına şuradan bakabiliriz:


http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

Bağlantısındaki -d, -e ve -f kontrollerinin açıklamaları. e böyle bir yol (path) bilgisi var mı diye kontrol ediyor gibi düşünebiliriz fakat path bilgisinin türüne dosya, dizin, soket vs.. bakmıyor. -f ve -d ise bu kontrolü de gerçekleştiriyor.

Bizim için çözüm yani kontrol mekanızması ise aşağıdaki gibi şekilleniyor diyebiliriz:


if [ -e $path ] then;
if [ -f $path ]then;
--> Bu standart bir dosya yazma için -w kontrolü uygun. (iç içe if yerine yukarıdaki -f kontrolü yanına VE mantıksal operatörü ile -w koyulabilir)
else // dosya değilse dizin olabilir
   if [ -d $path ]then;
    --> Bu standart bir dizin, yazma kontrolü için w yetersiz, bu dizine yazabilmem için -x hakkını da kontrol etmem gerekli. (yine iç içe ifler yerine -w kontrolü ve -x kontrolü yukarıdaki if'e yedirilebilir)
   else
    --> Elimdeki path bilgisi standart dosya ya da dizin değil, ihtiyaca göre işlem yapılmalı ya da yeni kontrol eklenmeli.
   fi
fi
else
--> dosya,dizin ya da soketim yok...
fi



Tekrardan elinize sağlık, iyi çalışmalar.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

if

#11
Betiği güncelledim arkadaşlar. Biraz daha karışık oldu ama teklemeden çalışıyor.

if

Betiği yine güncelledim. Bundan sonraki amacım echo yerine printf kullanmak.

if

#13
Betiği güncelledim. echo yerine printf'in kullanılmasının yanı sıra yazım stilini değiştirdim. Betikte fazla metin olunca betiğin okunabilirliğini artırmak amacıyla bloklar arasında nefes alınacak boşluklar koydum.

Betikte kullandığım BASH özelliklerini kısaca açıkladım ve her biri için faydalandığım bağlantıyı geçtim. Hataların yönetimi için BASH 4 sürümüyle gelen BASH_XTRACEFD değişkenini kullandım ve hemen hemen her komut için kontrol ekledim.

Hâlâ yeterince açıklamadığım kısımlar olsa da okuması zevkli ve bir o kadar da öğretici bir betik olduğu kanaatindeyim. Betiği okumak isteyenlere betik içeriğini sözdizimi vurgulaması olan bir metin editörüne kopyalayıp okumalarını tavsiye ederim.

Bu arada, betik tıkır tıkır yedek alma işlevini gerçekleştiriyor:)


mhmtkrktr

#14
Betikte bir sorunmu var, yoksa değişkeni elle mi tayin etmemiz gerekiyor?

############################# Zahralık #############################
Rsync ile yedek alan bir Bash betiği\n
Zahralık v3.3, Copyright (C) 2013-2015 Numan Demirdöğen
Zahralık comes with ABSOLUTELY NO WARRANTY;
for details type 'zahralık -g'
This is free software, and you are welcome
to redistribute it under certain conditions;
type 'zahralık -l' for details.\n
Betik değişkenleri denetleniyor...
batik.sh: hasat değişkeni tanımlanmamış!




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 11 Temmuz 2016 - 23:39:22


# Yedeğini almayı istediğiniz dizinleri tanımladığınız değişken.
# Dizinler arasında bir kararter boşluk bırakın ve
# dizin sonuna '/' ekleyin (tınak işareti olmadan).
# Örnek: "/etc/ /home/ubuntu/"
hasat=""


Belirtmişsin zaten, ben okumadan çalıştırmak istedim. :) Uçbirimde form şeklinde doldurulabilse veya zenity gibi araçlarla desteklense o bölüm, nasıl olurdu?


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 12 Temmuz 2016 - 00:08:09

Masaüstünde bulunan bir dizini tanımladım, gideceği konumu da verdim, bir adet dizin ve bir adet arşiv dosyası oluşturdu ama içi boş. Dizin yerine dosya gösterdim sonuç değişmedi. Ayrıca yedeklenecek bölümün sonuna neden "/" işareti istiyor? Yedeklenecek olan bir dosyaysa şöyle bir girdi oluşturmak gerekiyor bu şekilde,
/yol/abcd.txt/
Bu şekilde yanlış bir yol vermiş olmuyor muyuz?

if

@mhmtkrktr, batik.sh: hasat değişkeni tanımlanmamış! güncel betikte "batik" diye bir ifade geçmiyor. İmlâ hatası yapıp yapmadığıma baktım az önce, bulamadım. Güncel mi kullandığın betik?

Alıntı Yap
Belirtmişsin zaten, ben okumadan çalıştırmak istedim. :) Uçbirimde form şeklinde doldurulabilse veya zenity gibi araçlarla desteklense o bölüm, nasıl olurdu?

Zenity'yi özellikle kullanmıyorum çünkü betik grafik arayüzü olmayan bir sistem çalıştırıldığı takdirde Zenity işe yaramayacaktır. Ayrıca betiğin ek bir uygulamaya ihtiyaç duymadan çalışmasını istiyorum. Rsync ve BASH öntanımlı olarak çoğu dağıtımda öntanımlı geliyor. Fakat tanımlanmayan değişken olduğunda betiği sonlandırmak yerine tanımlanması için kullanıcıdan girdi isteyebilirim.

Alıntı Yap
Masaüstünde bulunan bir dizini tanımladım, gideceği konumu da verdim, bir adet dizin ve bir adet arşiv dosyası oluşturdu ama içi boş. Dizin yerine dosya gösterdim sonuç değişmedi.

Ne demek istediğini anlayamadım.

yedeklenecek_dizin/
├── abc.txt
├── arşiv.gzip
└── deneme

gibi bir yapıya sahip dizini /örnek/dizin/yolu gibi bir dizine yedeklemek istedin ve olmadı mı?

Alıntı Yap
Ayrıca yedeklenecek bölümün sonuna neden "/" işareti istiyor? Yedeklenecek olan bir dosyaysa şöyle bir girdi oluşturmak gerekiyor bu şekilde,
/yol/abcd.txt/
Bu şekilde yanlış bir yol vermiş olmuyor muyuz?

rsync el kitabından:
Alıntı Yap
rsync -avz foo:src/bar /data/tmp

       Bu  komut,  foo  makinesindeki  src/bar  dizinindeki  tüm dosyaları varsa altdizinlerdekileri de içererek yerel makinenin /data/tmp dizinine kopyalar. Dosyaların, sembolik bağların,
       aygıtların, özniteliklerinin, izinlerinin, sahiplerinin, v.s.sinin korunmasını sağlayan  "arşiv"  kipinde  aktarım  yapılır.  Buna  ek  olarak,  aktarım  işleminin  verileri  içeren
       kısımlarının boyutunu küçültmek için sıkıştırma uygulanır.

       rsync -avz foo:src/bar/ /data/tmp

       Kaynak  yolunun  sonuna  eklenen  / işareti hedefte ek bir dizin oluşturmaktan kaçınılması davranışını değiştirir. Sona eklenen bu / işaretinin "dizini ismiyle kopyala" davranışının
       zıddı olarak "bu dizinin içeriğini kopyala" anlamına geldiğini düşünebilirsiniz, fakat her iki durumda da dizinin öznitelikleri hedefteki dizine kopyalanacaktır. Başka bir  deyişle,
       aşağıdaki komutların her biri ile dosyalar aynı şekilde, /dest/foo dizininin öznitelikleri ayarlanarak kopyalanır:

       rsync -av /src/foo /dest
       rsync -av /src/foo/ /dest/foo

Dizin sonlarında "/" kullanarak hedef dizinde fazladan bir dizin oluşturulmasının önüne geçiyor ve filtreleme işlemi için istenmeyen dizinleri ifade etmek kolaylaşıyor. Tam olarak neyi nereye kopyalayacağımız daha net oluyor böyle.

Betiği tek bir dosyayı yedekleyecek şekilde çalışmıyor; dizinleri yedeklemek üzere yazıldı. Bir dosyayı yedeklemek için koca bir betiğe ihtiyaç yok.


mhmtkrktr

Alıntı Yapgüncel betikte "batik" diye bir ifade geçmiyor. İmlâ hatası yapıp yapmadığıma baktım az önce, bulamadım. Güncel mi kullandığın betik?
batik.sh benim masaüstüne koyduğum betik dosyasına verdiğim isimdi. Masaüstünde zaten çalışma yaptığım bir betik.sh olduğu için o ismi vermiştim ama betiğe önceden belirtilen bir ismin mi verilmesi gerekiyordu?

Alıntı YapZenity'yi özellikle kullanmıyorum çünkü betik grafik arayüzü olmayan bir sistem çalıştırıldığı takdirde Zenity işe yaramayacaktır. Ayrıca betiğin ek bir uygulamaya ihtiyaç duymadan çalışmasını istiyorum. Rsync ve BASH öntanımlı olarak çoğu dağıtımda öntanımlı geliyor. Fakat tanımlanmayan değişken olduğunda betiği sonlandırmak yerine tanımlanması için kullanıcıdan girdi isteyebilirim.

Olaya o tarafından bakmamıştım, doğru düşünmüşsün. Tanımlamaların en başta yapılacağı bir form hiç fena olmazmış ama. Hani betiğin içeriğiyle hiç uğraşmadan, çalıştırılınca
1: suradan al
2: suraya gönder
3: sıkıştırılsın
gibi.
Alıntı Yapgibi bir yapıya sahip dizini /örnek/dizin/yolu gibi bir dizine yedeklemek istedin ve olmadı mı?
İçinde dizinlerin ve dosyaların bulunduğu bir dizini, sonra da sadece bir dosyayı yedeklemesi için çalıştırdım. Her ikisi içinde taşınacak yere bir dizin ve bir tanede arşiv oluşturdu. Ancak her ikisininde içeriği boş. Yani benim yedeklemek istediğim içerik yok içinde.

rsync Arch taban kurulum listesinde yoktu, ilaveten kurulması gerekiyordu. İlave edilmişmidir bilmiyorum ama ben elle kurmuştum daha önce.

Alıntı YapDizin sonlarında "/" kullanarak hedef dizinde fazladan bir dizin oluşturulmasının önüne geçiyor ve filtreleme işlemi için istenmeyen dizinleri ifade etmek kolaylaşıyor. Tam olarak neyi nereye kopyalayacağımız daha net oluyor böyle.

İçeriğine çok fazla bakmadım ama ilgili dizin mkdir -p ile önceden oluşturulsa nasıl olurdu diye düşündüm.

ata1

@mhmtkrktr mesajları boşalt  :)) bunu sana otomatık yapan bir betik hazırla forum mesaj kutun dolu

if

21 Ağustos 2016 , zahralik 5.0 Sürüm Notları 

Bu sürümdeki yeni özellikler:

* Betiğin temel değişkenleri ( hasat, ambar, birikimli, seçenekler )
  tanımlanmamışsa ya da yanlış tanımlanmışsa bu değişkenlerin tekrar
  tanımlanmasını sağlayacak döngüler eklendi.
 
* hasat dizini ve ambar değişkeni için girilen dizinlerin var olup
  olmadığını denetleyen ve dizinler mevcut değilse ya da yanlış bir
  dizin yolu girilmişse tekrardan bu değişkenlerin tanımlanmasını
  sağlayan fonksiyonlar eklendi.
 
* Alınan son yedeğin çıkartılması işleminden önce yedeği çıkartmak için
  gerekli izinlere sahip olunup olunmadığını denetleyen bir fonksiyon eklendi.
 
* Her bir fonksiyona hata_topla() fonksiyonu eklenerek trace ve
  standart çıktıların diğer çıktılardan ayrıştırılması sağlandı.
 
* Betik, 5.0 sürümünde daha karmaşık bir yapıya büründüğü için betiği
  okuyanların betiğin nasıl işlediğini anlamalarını kolaylaştırmak adına
  süreç akış şeması güncellendi.

* hasat değişkeni $hasat() dizini olarak değiştirilerek dizin elemanlarına
  bir bir ulaşaıbilmenin yolu açıldı.
 
* PS4, BASH_XTRACEFD, LINENO BASH çevre değişkenleri ile
  $lastno değişkeni için açıklama girildi.

* denetle() fonsitonu daha çıklayıcı olması adına
  temel_degiskenleri_denetle olarak yeniden adlandırıldı

* Dizinlerin son karakterini denetleyen fonksiyon ambar değişkeni
  ve hasat dizini için ayrı ayrı yazıldı.
 
* Betikte kullanılan BASH özellikleri için açıklamalar girildi.