Kirjoittaja Aihe: Miten kopioida rsyncilla vain viimeisen vuorokauden aikana muuttuneet tiedostot?  (Luettu 3823 kertaa)

KalleR

  • Käyttäjä
  • Viestejä: 12
    • Profiili
Olen yrittänyt pähkiä ongelmaa mutten taida tajuta rsyncin valitsimia oikein että saisin tehtyä otsikkossa mainitun kopioinnin.

petteriIII

  • Käyttäjä
  • Viestejä: 693
    • Profiili
rsync -avt $(find mistä_kansiosta -name nimen_rajoitteet -type f -mtime -montako_vuorokautta_taaksepäin) mihin_kansioon

- minulla esimerkiksi: rsync -avt $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -10) ~/Elisa
- mutta helposti näihin pikaisesti tehtyihin "skripteihin" tulee virheitä joita ei heti tajuakaan joten kokeile ensin jossain harmittomassa
- ja yksinkertaisempi skripti löytyy varmasti aina.

Lisätty 21.9.2016:
Näin siinä käy kun yrittää väsyneenä. Ilmeisesti välilyönnit hyväksyvä on:
Koodia: [Valitse]
rsync -rlptvzs $(find mistä_kansiosta_lähtien -name nimen_tarkenne  -type f -mtime -montako_päivää_taaksepäin) mihin_kansioon
esimerkiksi:
Koodia: [Valitse]
rsync -rlptvzs $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -500) ~/Elisa

- laitoin sen tänne  väliaikaiseen talteen koska osaan ilmeisesti hävittää mitähyvänsä - tuntuu toimivan; täytyy tarkistella. Sivuvaikutuksiakin on: mikäli kopioitavassa tiedostopuussa on useampia joilla on eri polku mutta sama tiedostonimi niin vain yksi kopioituu. Kyllä tällä silti käyttöä on: nopeuttaahan tämä varsinkin isojen muuttumattomien tiedostojen kopiomisessa tai kun ei tiedä missä kansiossa kopioitava on.
- varsinkin find:illä on vielä miljoona parametria joten räätälöinti onnistuu melkein millaiseen tehtävään tahansa - jopa regex saadaan mukaan.
- ja nopeutta löytyy paljon - eiköhän Perl ja Pythonkin ole vaikeuksissa.
« Viimeksi muokattu: 21.09.16 - klo:19.00 kirjoittanut petteriIII »

KalleR

  • Käyttäjä
  • Viestejä: 12
    • Profiili
rsync -avt $(find mistä_kansiosta -name nimen_rajoitteet -type f -mtime -montako_vuorokautta_taaksepäin) mihin_kansioon

Ongelmana tämän skriptin kanssa on tiedostonimet joissa on välilyönti

jekku

  • Käyttäjä
  • Viestejä: 2624
    • Profiili
....
Ongelmana tämän skriptin kanssa on tiedostonimet joissa on välilyönti

Moiset tiedostonimet kuplivat hankaluuksia muuallekin, joten eiköhän nuo kannata korjata ensin...

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

petteriIII

  • Käyttäjä
  • Viestejä: 693
    • Profiili
Alkuperäisestä viestistä oli tipahtanut edestä pois IFS=$'\n' . Jotta nimissä sallittaisiin välilyönnit. Perään olisi hyvä liittää: unset IFS
Siis käsky olisi pitänyt olla:
Koodia: [Valitse]
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT -name "*" -type f -mtime -500) ~/Elisa; unset IFS

- ja nopeus on tosiaan vertaansa vailla - varsinkin jos kopiointi tehdään varmuuden vuoksi: kun halutaan olla varmoja siitä että kaikki on viimeistä versiota.
- nopeus on niin suuri koska vaikka koodi on BASH:ia niin koodin suoritus tapahtuu enimmäkseen C:ssä. BASH:issa toimiminen on hidastuu hirvittävästi suoritettavan rivimäärän kasvaessa - ja loopatessa erittäinkin. Luulisinpa että Perl ja Pythonkin ovat helisemässä näiden yksirivisten kanssa - eivätkä olekaan enää ylivertaisia.
- ja soveltamalla find:in miljoonaa optiota ja kytkintä voidaan räätälöidä toiminta melkein miksi halutaan. Tai rsynkata SSH:n yli.
- mutta tehtävän suorittaminen kuvatulla tavalla saattaa johtaa väärään tulokseen riippumatta siitä käytetäänkö kopiointiin rsync:ia, mv:tä, cp:tä tai jotakin muuta: mikäli tiedostopoluilla on samannimisiä tiedostoja kopioituu niistä vain yksi. Onhan se helppolukuista, ja mikäli kaikki halutaan saada lopputulokseen on rsync:in kytkimien pikku r muutettava isoksi R:ksi mutta se johtaa vaikeasti luettavaan lopputulokseen.

Kopioinnin rajoittimia:
Koodia: [Valitse]
Kopioinnin estäminen mikäli polulla on jokin merkkiryhmä:
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT ! -path "*ARKISTO*" -type f -mtime -500) ~/Elisa; unset IFS

Kopioinnin estäminen mikäli kopioitavan nimi päättyy numeroon:
IFS=$'\n'; rsync -rlptvzs $(find ~/OMATSKRIPTIT ! -iregex ".*[0-9]$"   -type f -mtime -500) ~/Elisa; unset IFS
« Viimeksi muokattu: 22.09.16 - klo:18.15 kirjoittanut petteriIII »