Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: KalleR - 11.09.16 - klo:23.01
-
Olen yrittänyt pähkiä ongelmaa mutten taida tajuta rsyncin valitsimia oikein että saisin tehtyä otsikkossa mainitun kopioinnin.
-
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:
rsync -rlptvzs $(find mistä_kansiosta_lähtien -name nimen_tarkenne -type f -mtime -montako_päivää_taaksepäin) mihin_kansioon
esimerkiksi:
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.
-
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
-
....
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...
-
http://forum.ubuntu-fi.org/index.php?topic=47969.0
-
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:
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:
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