Přenesení souboru v unixu

Boss3456

Přenesení souboru v unixu
« kdy: 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.


pavel

Re: Přenesení souboru v unixu
« Odpověď #1 kdy: 14. 04. 2010, 19:32:37 »
Napiš zde tvůj skript, který jsi zkoušel a popiš přesně, co ti to (ne)dělá.

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #2 kdy: 14. 04. 2010, 19:50:49 »
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

Re: Přenesení souboru v unixu
« Odpověď #3 kdy: 14. 04. 2010, 20:51:50 »
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>'

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re: Přenesení souboru v unixu
« Odpověď #4 kdy: 14. 04. 2010, 21:22:20 »
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?


Boss3456

Re: Přenesení souboru v unixu
« Odpověď #5 kdy: 14. 04. 2010, 21:26:14 »
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.

rob

Re: Přenesení souboru v unixu
« Odpověď #6 kdy: 14. 04. 2010, 22:55:47 »
Toto slouzi jen jako priklad, upravte si to podle sebe ...
zaloha
Kód: [Vybrat]
cd /
tar cvzf /backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/media --exclude=/sys --exclude=/backup.tgz /
obnova
Kód: [Vybrat]
cd /
tar xvz --same-owner -f backup.tgz -C /
mkdir /proc
mkdir /lost+found
mkdir /mnt
mkdir /sys
mkdir /media

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #7 kdy: 15. 04. 2010, 08:09:52 »
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.

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #8 kdy: 15. 04. 2010, 08:36:13 »
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 – '

Re: Přenesení souboru v unixu
« Odpověď #9 kdy: 15. 04. 2010, 09:46:59 »
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
ssh vzdaleny -C 'tar -cf - soubory | gzip' |gunzip |tar xvf -

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #10 kdy: 15. 04. 2010, 13:58:45 »
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

Kód: [Vybrat]
#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!

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re: Přenesení souboru v unixu
« Odpověď #11 kdy: 15. 04. 2010, 14:23:45 »

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.

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #12 kdy: 15. 04. 2010, 14:39:25 »
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)

Re: Přenesení souboru v unixu
« Odpověď #13 kdy: 15. 04. 2010, 14:48:20 »
Ad #1:
Podle mě by to mohlo fungovat takto:
Kód: [Vybrat]
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?
Kód: [Vybrat]
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í :)
« Poslední změna: 15. 04. 2010, 18:24:58 od Ondřej Caletka »

Boss3456

Re: Přenesení souboru v unixu
« Odpověď #14 kdy: 15. 04. 2010, 16:09:18 »
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:

Kód: [Vybrat]
ssh sunray1 -C 'tar -cf - $HOME/uloha16 | gzip' | gunzip | tar xvf -C $HOME/pom16

Dekuji moc!