Fórum Root.cz
		Hlavní témata => Vývoj => Téma založeno: Boss3456  14. 04. 2010, 17:28:24
		
			
			- 
				Zdravím, řeším doma problém, mám pomocí programů find, tar a gzip archivovat do souboru "archivace" všechny soubory v domovském adresáři, které ve svém názvu neobsahují „temp“ a jsou novější než soubor „hotovo“ a poté bych pomocí ssh, tar a gzip přenést obsah adresáře local1:$HOME/uloha16 do $HOME/pom16 tak, aby byl co nejméně zatěžován přenosový kanál objemem dat (samozřejmě tak, jako bych byl přihlášený na jiném stroji než local1 a oba adresáře byly na daných strojích lokální).
 
 Neměl byste někdo radu do začátku? V linuxu jsem začátečník a pokoušel jsem se o to, ale nefungovalo to.
- 
				Napiš zde tvůj skript, který jsi zkoušel a popiš přesně, co ti to (ne)dělá.
			
- 
				Zatím řeším tu první část bez toho přenášení a tady mám tohle, ale nevím jak udělat, aby to vyhledávalo všechny soubory kromě temp a pak nevím jestli správně dělám, aby se mi ty soubory zarchivovali. 
 
 find . -name "*temp*" - newer "hotovo" | tar cvf – archivace | gzip > archivace.tar.gz
 
 Je na tom alespoň něco dobře?
 Děkuji
 
- 
				V podstatě je to dobře, až na to, že:
 - Podmínku je na neobsahování temp, nikoli obsahování. Asi pomůže oescapovaný vykřičník.
- Výstupem findu je seznam souborů, ovšem tar v této konfiguraci žádný vstup nepředpokládá, místo toho chce seznam souborů na příkazovém řádku. Mohla by to pomoci vyřešit volba --files-from u taru. Já bych ale možná raději zkusil find zahodit a použít přímo volby taru --exclude a --newer, viz man tar.
 
 Když se ti podaří tato první úloha, pak bude druhá snadná – stačí si uvědomit, že ssh umožňuje spustit na vzdáleném počítači jakýkoli proces (třeba i tar, nebo gunzip, nebo obojí) a předávat na jeho standardní vstup data. Takže stačí spojit <zabalení> | <komprese> | ssh vzdaleny -c '<dekomprese> | <rozbaleni>'
 
- 
				Nemohl byste to nejak lepe vysvetlit? Vy chcete vytvorit soubor archivace.tar.gz podle urcitych podminek nekde na stejnem stroji, jako archivovana data a pak to pres ssh presypat na jiny stroj a tam to zase rozbalit?
			
- 
				Děkuji, pokusím se to udělat dle Vašeho návodu......jinak ty dvě úlohy spolu prosím nesouvisí, já jsem to asi špatně napsal. 
			
- 
				Toto slouzi jen jako priklad, upravte si to podle sebe ...
 zaloha
 cd /
 tar cvzf /backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/media --exclude=/sys --exclude=/backup.tgz /
obnova
 cd /
 tar xvz --same-owner -f backup.tgz -C /
 mkdir /proc
 mkdir /lost+found
 mkdir /mnt
 mkdir /sys
 mkdir /media
- 
				Tak jsem tu první část vyřešel takhle:
 find . - name "*temp*" - newer "timestamp" > tar.list | tar cvf archivace -I tar.list | gzip > archivace.tar.gz
 
 Jen bych se chtěl zeptat, jak udělám, aby to vyhledalo soubory kam NEpatří "temp". Když dám před to vykřičník, jak psal kolega, tak to nefunguje.
- 
				Druhou část pomocí ssh jsem vyřešil následovně, ale nevím jestli je obojí dobře, mohl bych Vás poprosit o kontrolu? Děkuji mnohokrát
 
 tar cvf $HOME/uloha16 | gzip > uloha16.tar.gz | scp sunray1@192.168.0.1:/$HOME/uloha16 /$HOME/pom16 -c' gunzip < uloha16.tar.gz | tar xvf – '
- 
				Tak jsem tu první část vyřešel takhle:
 find . - name "*temp*" - newer "timestamp" > tar.list | tar cvf archivace -I tar.list | gzip > archivace.tar.gz
 Pokud přesměrováš výstup do souboru, pak už nepotřebuješ rouru mezi find a tarem. Lepší by bylo u taru použít jako název souboru - pak by to četlo ze standardního vstupu.
 
 Poznámka na okraj:
 Příště prosím dej jasně na vědomí, že jde o Solaris a ne Linux. Solarisácký tar je poněkud odlišný od GNU taru.
 
 Jen bych se chtěl zeptat, jak udělám, aby to vyhledalo soubory kam NEpatří "temp". Když dám před to vykřičník, jak psal kolega, tak to nefunguje.
 
 Mně to takto funguje:find . \! -name "*temp*"Ale nemám k dispozici Solaris, takže nemůžu vyzkoušet.
 
 Druhou část pomocí ssh jsem vyřešil následovně, ale nevím jestli je obojí dobře, mohl bych Vás poprosit o kontrolu? Děkuji mnohokrát
 
 tar cvf $HOME/uloha16 | gzip > uloha16.tar.gz | scp sunray1@192.168.0.1:/$HOME/uloha16 /$HOME/pom16 -c' gunzip < uloha16.tar.gz | tar xvf – '
 
 Zcela špatně. Opět stejný problém – když už přesměruješ výstup, nemá tam roura co dělat. Samozřejmě můžeš to udělat tak, že soubor na jednom PC zabalíš, pak pomocí scp zabalený soubor přeneseš a třetím příkazem na druhé straně rozbalíš. Ale cílem této úlohy bylo přenést to najednou bez vytváření mezisouborů, tedy s použitím SSH. Navíc pokud jsem zadání pochopil dobře, tak to máš přenést ze vzdáleného na lokální počítač. Takže by to mělo vypadat zhruba takhle:
 ssh vzdaleny -C 'tar -cf - soubory | gzip' |gunzip |tar xvf - 
- 
				Wow, děkuji Vám za cenné připomínky a rady a omlouvám se, že jsem hned na začátku nesdělil, že nejde o Solaris, já nevěděl, že je v taru rozdíl u těchto systémů. Moc jste mi pomohl! 
 
 nakonec jsem to udělal takhle a myslím, že by to mělo jet, jen si nejsem jistý tím přesměrováním u té dvojky
 
 #1
 find . \! -name "*temp*" - newer "timestamp" > tar.list
 tar cvf uloha16 -I tar.list | gzip > uloha16.tar.gz
 
 (zdej sem to zkoušel i takhle:
 find . \! -name "*temp*" - newer "timestamp" | tar cvf - | gzip > uloha16.tar.gz
 ale to mi neběželo.)
 
 #2
 Zde si nejsem jistý tím konečným přesměrováním, je to takhle možné prosím?
 
 ssh sunray1@... -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf - > $HOME/pom16
 
 
 Děkuji Vám všem za cenné rady!
- 
				
 ssh sunray1@... -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf - > $HOME/pom16
 
 
 
 Nejak nechapu, co chcete delat. Vy chcete zatarovat, co jiz bylo zatarovano, poslat to to gzipu a hned zase do gunzipu, aby se CPU zahralo a nasledne to zase roztarovat? Btw, zkousel jste se divat na rsync? Pokud vim, existuje i na Solaris a treba by se vam podarilo ho presne napasovat na to, o co se pokousite. Presne zadani znate vy, me porad trochu unika, o co *presne* se pokousite.
- 
				Tohle druhe zadani vubec nesouvisi s tim prvnim!! To uz jsem tu nekde psal, ty dve ulohy jsou na sobe nezavisle, vubec to nesouvi s tou jednickou. Chci udelat to, ze pomoci SSH,taru a gzipu prenesu obsah adresare, ktery je vzdaleny rekneme na domene sunray1:$HOME/uloha16 a chci ho prenest do adresare $HOME/pom16 (samozřejme tak jako bych byl
 prihlaseny na jinem stroji nez sunray1 a oba adresáře byly na danych strojich lokálni)
- 
				Ad #1:
 Podle mě by to mohlo fungovat takto:
 find . \! -name "*temp*" - newer "timestamp" | tar cvf - -I - | gzip > uloha16.tar.gz 
 
 A ještě k #1: možná je trochu problém, že zatímco find vypíše jeden každý soubor, tar zabaluje celé adresáře, takže vlastně každý soubor v podadresáři zabalí dvakrát (jednou jako součást podadresáře a podruhé jako vlastní soubor), v podpodadresáři třikrát, atd. GNU tar má na to volbu --no-recursion, ale Solaris zřejmě ne. Takže to chce asi přemluvit find, aby nevypisoval samostatné adresáře.
 
 #2
 Zde si nejsem jistý tím konečným přesměrováním, je to takhle možné prosím?
 ssh sunray1@... -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf - > $HOME/pom16
 Nikoli. Program tar rozbaluje do aktuálního adresáře. Přesměrování výstupu akorát způsobí, že nebude vypisovat na konzoli jména souborů, které vytváří ale zapíše je do uvedeného souboru. Pokud chceš změnit adresář, do kterého má tar rozbalovat, je na to volba -C <jméno adresáře>.
 
 Nejak nechapu, co chcete delat. Vy chcete zatarovat, co jiz bylo zatarovano, poslat to to gzipu a hned zase do gunzipu, aby se CPU zahralo a nasledne to zase roztarovat? Předpokládám, že $HOME/uloha16 je adresář. A pokud se na ten příkazový řádek podíváš pořádně, zjistíš, že gzipování se provádí na vzdálené straně, zatímco gunzipování na lokální – jde tedy o efektivní využití přenosového kanálu.
 
 Btw, zkousel jste se divat na rsync? Pokud vim, existuje i na Solaris a treba by se vam podarilo ho presne napasovat na to, o co se pokousite. Presne zadani znate vy, me porad trochu unika, o co *presne* se pokousite. Vzhledem k tomu, že jde o školní úlohu s předepsanými nástroji není třeba přemýšlet nad účelností takového řešení :)
- 
				Ano s tim findem by mohl byt i tenhle problem, ale myslim, ze tim uz se zabyvat nebudu. JInak diky moc za pomoc!
 
 Jinak pokud jsem dobre pochopil tu dvojku, tak by to melo vypadat ve finalni verzi takhle:
 
 ssh sunray1 -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf -C $HOME/pom16
 
 Dekuji moc!
 
- 
				ssh sunray1 -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf -C $HOME/pom16
 
 Spíš takhle:ssh sunray1 -C 'tar -cf - -C $HOME/uloha16 . | gzip' | gunzip | tar xvf - -C $HOME/pom16
 
Ale to už je jen drobný detail.
- 
				Dekuji Vam moc!