Sziasztok!
Kezdő vagyok még, így sokat keresgéltem a megoldás után, de nem találtam semmit.
egy txt fájlban soronként van eltárolva, hogy mit szeretnék másolni és hova.
Például:
innen1 ide1 fájl1
innen2 ide2 fájl2
innen3 ide3 fájl3
stb...
S ezt a txt fájlt szeretném egy bash scripttel feldolgozni.
Valahogy úgy képzelem el, hogy soronként kiveszi a szavakat, berakja változóba, s utána ezek segítségével meghívni az rsyncet.
De nem vagyok ebben biztos..
Tudtok segíteni, hogy milyen ciklussal kellene elérni ezeket a változókat?
Bármilyen ötletnek örülök.
- 2002 megtekintés
Hozzászólások
Valami ilyen kell neked...
Hibaellenőrzés nincs benne!!!
cat todo.txt | while read honnan hova fajl
do
cp $honnan/$fajl $hova
done
--
Debian Linux rulez... :D
- A hozzászóláshoz be kell jelentkezni
Köszönöm a gyors választ. Kipróbáltam, s asszem ez kell majd nekem.
Szuper!
- A hozzászóláshoz be kell jelentkezni
Az ilyesmi okosságokat sokszor úgy szoktam, hogy először kiíratom, hogy mit csinálna:
awk '{print "mv " $1 "/" $2 " " $3}'
Ha ez ránézésre stimmel, akkor egy | sh
-val megtoldom.
- A hozzászóláshoz be kell jelentkezni
Nem rossz az eval sem, és akkor nem kell még egy shellt indítani.
- A hozzászóláshoz be kell jelentkezni
Valamint lehet beleépíteni a spéci karakterek eltakarását is, nehogy legyen benne egy kis ` :-) (Az ilyen szövegfájlokat tipikusan generáltatják, a könyvtárstruktúrából programokkal, márpedig a felhasználónak megtiltani nem lehet, hogy `anyád` nevű fájlt hozzon létre. És mihelyt anyád helyett valami hasznosabb van benne, akkor lehet szívni az eval-lal.
- A hozzászóláshoz be kell jelentkezni
A path listát soha nem kezelem szkriptben. Ha körbebástyázod mindenfél idézőjellel meg bekkszlessel, akkor is jöhet egy újabb függvényhívás ahol csak elszúrtad. ;)
A megoldás pl. awk, sed, c, stb soronként feldolgozva. Ekkor a bináris kezelés miatt mindegy a tartalma.
Gondolok itt arra, hogy pl. egy gets()+stat() soha nem igényel idézőjelet - még utf-8 esetén sem. :)
- A hozzászóláshoz be kell jelentkezni
eval `awk ... `
módon?
- A hozzászóláshoz be kell jelentkezni
Itt egy kis példa:
eval $(awk 'BEGIN {print "pwd;";print "pwd"}')
(Jó a "visszaaposztróf" is. ;)
Figyeld meg az első parancs utáni pontosvesszőt! Ha több parancsot kell kiadni, akkor a parancs utáni sorelválasztó jelet is kell alkalmazni, mert csak LF esetén egy sornak veszi!
- A hozzászóláshoz be kell jelentkezni
> Nem rossz az eval sem, és akkor nem kell még egy shellt indítani.
vs:
eval `awk`
Most attól, hogy backtick helyett $( awk ) van, attól még pont indítasz plusz egy shellt ;-)
- A hozzászóláshoz be kell jelentkezni
Arról van ittennék szó:
command1 | sh
helyett
eval command1
aholis:
az sh=sh
az eval=builtin
Teccik érteni?
- A hozzászóláshoz be kell jelentkezni
Én értem, de a példákban ti mind a ketten parancshelyettesítést írtatok - régi, és új szintaxissal; az más kérdés, hogy te nem azt mondtál. (Nekem nem kell magyarázni az eval-t, azt is használtam, amikor arra volt szükség.)
- A hozzászóláshoz be kell jelentkezni
Olvasd el ezt!
Ebben szerepelt: "Ha ez ránézésre stimmel, akkor egy | sh-val megtoldom."
Erre válaszoltam, hogy a megtoldás helyett elég lehet az eval.
Fogadjunk, nem tudod ilyen világosan elmagyarázni mi a kötözködésed tárgya! ;)
- A hozzászóláshoz be kell jelentkezni
Ja, és mint tudjuk az LF az része az IFS-nek tehát nem csoda, hogy nem parancs végének, hanem szóelválasztónak veszi a shell. (Amúgy szerintem nem "parancs utáni sorelválasztó"-t akartál írni, hanem pont hogy parancselválasztót - azaz ";"-t.)
- A hozzászóláshoz be kell jelentkezni
Így igaz. A téves asszociáció a commandline - kézi üzemmód - csökevénye.
- A hozzászóláshoz be kell jelentkezni
Akkor próbáld meg egy olyan paranccsal, aminek hosszú a kimenete ("Argument list too long").
- A hozzászóláshoz be kell jelentkezni
[Agresszív Kismalac mód on]
Nem próbálom!
Először gondolkodni szoktam!
[Agresszív Kismalac mód off]
Van olyan, hogy ARG_MAX meg ennek maximális mérete. Ezen kívül pont annyi, amennyinek a kezelésére az adott programot felkészítették. Pl. az awk is rendelkezik maximális mezőszámmal és mezőmérettel. Ezeket érdemes elolvasni. Most éppen egy 2021000 elemű file listával dolgozom, de semmi ilyen hibaüzenetet nem kaptam...
- A hozzászóláshoz be kell jelentkezni
Tegyük hozzá, hogy ha tényleg linuxon darálunk (és nem egy 2.6.huszonakárhány előtti darabbal), akkor ez az ARG_MAX akármennyi is, az ulimit -s X ráncba tudja szedni (beállítja (X/4)K-ra), ha a hard ulimitünk is úgy akarja.
- A hozzászóláshoz be kell jelentkezni
Láttam a fícsőrt a local_limits.h-ban. Ez olyan windows-developer szemlélet: a maximális string mérete = a diszk méretével. Régebben olyan rendszeren dolgoztam (AIX), ahol 2000 volt ez az érték - ha az adott program fekészült rá. Pontosan az utóbbiért - hiszem, ha látom alapon - csak belátható és kis számosságú paramétert használok. Kicsi a monitorom! ;)
- A hozzászóláshoz be kell jelentkezni
Emlékeim szerint az AIX-on hajdan rebootot igényelt a megváltoztatása, és azért az mégis egy kapjákmárbe helyzet volt.
Hálistennek azért ma már nem használhatatlanul konzervatív az alapértelmezett érték, és röptében változtatható, de azért az a végső maximumnak meghatározott 4M nem egy teljesíthetetlen mennyiség - aminek persze jótékony pedagógiai hatása van a globbing-find-xargs háromság szempontjából.
- A hozzászóláshoz be kell jelentkezni
Örülök.
- A hozzászóláshoz be kell jelentkezni