Van néhány fájlom (xaa, xab...), melyek gigabájtos nagyságúak. Összekapcsolhatom őket ugyan egy cat xa? > egyben paranccsal is, de ez lassú, és felesleges duplikációt hoz létre a tárterületen. El lehet-e valami (fájlrendszer szintű) megoldással érni azt, hogy az xaa végét odakapcsoljuk az xab elejéhez, az xab végét az xac elejéhez stb., mely folyamat végén az egész fájl olyan lesz, mintha cattel kapcsoltuk volna össze?
Szerk: Ahogy látom, ezzel már más is küzdött - http://stackoverflow.com/questions/5893531/fast-concatenate-multiple-fi…
- 6527 megtekintés
Hozzászólások
Nem próbáltam ki, de:
mkfifo /tmp/fifo0 && cat xa? > /tmp/fifo0
Másik terminálban (vagy screen vagy &, stb. tetszés szerint) pl. mplayer /tmp/fifo0
Bár ilyenkor a seek ugye minimum problémás, szóval aligha 100%-os megoldás.
- A hozzászóláshoz be kell jelentkezni
Effélére gondoltam, köszi! (Gondolatolvasó vagy, hogy a fájlt mplayerrel kell "feldolgozni".)
- A hozzászóláshoz be kell jelentkezni
Ha mplayerrel való lejátszáshoz kell, akkor egyszerűbb megoldás is van.
mplayer -fs <és itt felsorolod, amiket akarsz. A shell *-ja is játszik>
és lejátsza az összeset fullscreenben.
- A hozzászóláshoz be kell jelentkezni
Nekem ez így nem megy.
mplayer -fs < xa*
bash: xa*: kétértelmű átirányítás
Vagy, ha explicite felsorolom, akkor sem szereti: mplayer -fs < xaa xab xac xad
... mplayer: No such file or directory... (pedig vannak ilyen fájlok)
- A hozzászóláshoz be kell jelentkezni
mplayer -fs xa*
a < és > nem átirányítás jel volt :-)
- A hozzászóláshoz be kell jelentkezni
Az első darabot lejátssza az mplayer -fs xa*, de a továbbiakkal nem tud mit kezdeni, csak kiírja prózai módon:
Playing xab.
Playing xac.
Playing xad.
- A hozzászóláshoz be kell jelentkezni
Ez csak nagyon kevés formátumnál/kodeknél működik, mert itt darabolt fájlok vannak, azaz egy marha nagy avi (vagy bármi) szét van szeletelve. Esetleg mpeg működhet, főként mpeg-ts-ben (asszem).
- A hozzászóláshoz be kell jelentkezni
A Linux userspace fájlrendszer API-jának (fusermount) segítségével lehet írni erre modult. Még magasszintű nyelvekhez is van illesztője. Egyszer brahiból még Javában is írtam fájlrendszer illesztőt egy tutorial alapján. Tehát írsz egyet, ami a darabokból katalógust épít magában, és az olvasási műveleteket megvalósítja a forrásokra mappeléssel, majd ezt mountolod, és kész is vagy :-).
- A hozzászóláshoz be kell jelentkezni
Az itt Árpi által javasolt dmsetup-os viccel lehetne belóle egy db. device-ot csinálni. Esetleg azt is lehetne valahogy használni.
- A hozzászóláshoz be kell jelentkezni
Ez szimpatikus, de mivel még sohasem csináltam ilyet, kérnék egy kis támogatást.
Itt is vannak példa szkriptek (pl. "Join 2 devices together"), de ezek mintha már létező device-okat matatnának. Nekem egyelőre 4 db egyszerű fájlom van (xa*), amiből 3 db 2GB-os, meg egy kisebb. Hogy kell elkészíteni a kívánt device-okat? (MAKEDEVvel? S hogy lehet elérni, hogy ne kapjak "BLKGETSIZE: A függvény nincs megvalósítva" hibajelzéseket a blockdev --getsize használatakor?)
- A hozzászóláshoz be kell jelentkezni
A fajlokbol eszkozoket a losetup-pal kell csinalni. A 'losetup -v -f xaa' eredmenye lesz egy /dev/loop? (tipikusan loop0, elvben a -v hatasara ki is irja de ez verziofuggo). Ugyanigy a tobbibol, es ezeket kellene osszefuzni a dmsetup-pal. Szerintem, de lehet hogy megy egyszerubben is.
- A hozzászóláshoz be kell jelentkezni
Teljesen jó, amit írsz. Ezután:
losetup -v -f xaa; losetup -v -f xab; losetup -v -f xac; losetup -v -f xad
már jöhet is az összefűzés: http://pastebin.com/PtEDQH7G
Majd pedig mplayer /dev/loop0 szépen lejátssza, amit kell (egybefűzve, teljes értékű fájlként).
Ami még kérdésként maradt bennem: hogy lehet ezt az állapotot visszacsinálni?
- A hozzászóláshoz be kell jelentkezni
(Hm, hat szerintem nem mlayer /dev/loop0 kellene, hanem mplayer /dev/device-mapper/joined, de kb mindegy addig, amig megy.)
Megszuntetni ha jol tudom 'dmsetup remove joined' es 'losetup -d /dev/loop[0123]' parancsokkal kell kb.
- A hozzászóláshoz be kell jelentkezni
Köszi! (Jól írod az mplayer paraméterét; csak tévedésből ment a loop0... (a film eleje).)
Összefoglalás (ha a "joinus" szkriptbe tesszük a fent idézett pastebin-es részt):
for i in xa*; do losetup -v -f $i; done; ./joinus /dev/loop{0..3}
mplayer /dev/mapper/joined
Majd utána a "takarítás": dmsetup remove joined; losetup -d /dev/loop[0123]
Eredetileg csak rootként látom a /dev/mapper/joined fájlt, de ez orvosolható egy chown envagyok /dev/mapper/joined paranccsal.
- A hozzászóláshoz be kell jelentkezni
Ez majdnem jo, csak arra keszulj fel, hogy nem biztos, h loop[0-3] neven jonnek letre losetup-pal a fajlok. Pont azert van -v hogy lasd miket osztott ki a rendszer, illetve a -f azt helyettesiti, hogy te kezzel megadjad (mondhatod azt is, h losetup -v /dev/loop0 xaa, ebben az esetben meg szepen hibauzenetet kapsz, ha mar hasznalatban van)
- A hozzászóláshoz be kell jelentkezni