Egy olyan lista érdekelne, melyben össze van gyűjtve mondjuk az avi fájlokról, hogy az adott fájlnak mi a neve, mérete, codec-e, sztereó-e stb.
Úgy vettem észre hogy ezeket az infókat a mediainfo paranccsal csak egyesével tudom kinyerni.
files="*.avi"
for i in ${files} ; do
filename=$(mediainfo --Inform=General\;%CompleteName% "${i}")
format=$(mediainfo --Inform=General\;%Format% "${i}")
filesize=$(mediainfo --Inform=General\;%FileSize/String% "${i}")
duration=$(mediainfo --Inform=General\;%Duration/String% "${i}")
aspect=$(mediainfo --Inform=Video\;%DisplayAspectRatio/String% "${i}")
codec=$(mediainfo --Inform=Video\;%CodecID/Hint% "${i}")
wh=$(mediainfo --Inform=Video\;%Width%x%Height% "${i}")
acodec=$(mediainfo --Inform=Audio\;%CodecID/Hint% "${i}")
chan=$(mediainfo --Inform=Audio\;%Channels% "${i}")
ster=$(mediainfo --Inform=Audio\;%Format_Settings_ModeExtension% "${i}")
bitrate=$(mediainfo --Inform=Audio\;%BitRate/String% "${i}")
lang=$(mediainfo --Inform=Audio\;%Language% "${i}")
echo ${filename} - ${format}, ${filesize}, ${duration}, ${aspect}, ${wh}, ${chan}, ${ster}, ${codec}, ${acodec}, ${bitrate}, ${lang} >> movie.lst
done
Ez a kis kód még működik is, de arra még nem jöttem rá, miként oldjam meg, ha az avi fájlok almappákban vannak?
Ha esetleg létezik egyszerűbb módszer azt is megköszönöm.
Hozzászólások
Csinálj egy rekurzív függvényt, s az bejárja neked az alkönyvtárakat.
Valami ilyesmire gondoltam:
#!/bin/bash
deep() {
while read; do
if cd "$REPLY" 2>/dev/null; then
deep
cd ..
continue
fi
if [ -f "$REPLY" ]; then
: # vizsgálat
fi
done < <(ls -1)
}
deep
exit 0
Nyilván a vizsgálatot bele kell írni.
Szerk.: Aztán vannak azok, akik tudják használni a
find
parancsot... :)tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Nos valamilyen oknál fogva ez 7 példányban készült el.
Igen a find. Én is próbáltam, de nem jött össze.
Az exe után nem tudok for ciklust tenni közvetlenül, így hát kiexportáltam ezt a for ciklust egy külön fájlba és úgy adtam meg. Akkor lefutott, de végtelen ciklusba került. Nem akart leállni.
find ${Movie_path} -type f -exec /home/csablak/bin/vizsgalat {} \; -print
A find-hoz nem értek. Mi készült el 7 példányban?
Szerk.: A vizsgálathoz egyetlen vizsgálat kell, mert én már végigmegyek a file-okon. Oda már nem kell ciklus.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Ez lett.
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
1 Istenek fegyverzete - 1987.avi - AVI, 705 MiB, 1h 24mn, 16:9, 640x352, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
2 Istenek fegyverzete - 1991.avi - AVI, 704 MiB, 1h 42mn, 2.35:1, 640x272, 2, MS Stereo, DivX 3 Low, MP3, 128 Kbps,
De a find-del az eddigi legjobb eredményem ez:
find -name "*.avi" -exec mediainfo "--Inform=General;%CompleteName%/%Format%/%FileSize/String%/%Duration/String%" {} \; -exec mediainfo "--Inform=Video;%DisplayAspectRatio/String%/%CodecID/Hint%/%Width%x%Height%" {} \; -exec mediainfo "--Inform=Audio;%CodecID/Hint%/%Channels%/%Format_Settings_ModeExtension%/%BitRate/String%/%Language%" {} \;
./1 Istenek fegyverzete - 1987.avi/AVI/705 MiB/1h 24mn
16:9/DivX 3 Low/640x352
MP3/2/MS Stereo/128 Kbps/
./2 Istenek fegyverzete - 1991.avi/AVI/704 MiB/1h 42mn
2.35:1/DivX 3 Low/640x272
MP3/2/MS Stereo/128 Kbps/
Bár rakná szépen egymás mellé...
.
Ha vannak linkelt alkönyvtárak, netán van benne loop, akkor végtelen ciklus és végtelen memóriafoglalás is lehet belőle. Az nem lehet, hogy különböző helyeken is megvan a file?
Amúgy a megoldásom valóban lehet bugos, nem gondoltam végig. Rekurzív híváskor szerintem nem subshell hívódik - illetve nem tudom -, és akkor bizony felülíródik a REPLY értéke. Lehet, kellene használni a gömbölyű zárójelet annak érdekében, hogy subshell hívódjon. Vagy, csak simán az ls -1 kimenetét a while ciklusba pipe-olni, mert úgy biztosan önálló process, így subshell lesz a ciklus. Értelemszerűen a process helyettesítés a done után akkor nem kell.
A legegyszerűbb: a deep-en belüli deep hívást tedd gömbölyű zárójelek közé:
(deep)
Magyarázat:
read <<<alma; read <<<korte; echo "$REPLY"; echo "$REPLY"
korte
korte
read <<<alma; (read <<<korte; echo "$REPLY"); echo "$REPLY"
korte
alma
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Bár rakná szépen egymás mellé...
Végén csinálhatsz sort-ot.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Nos az eredmény egész meggyőző, de lehetne némely esetben jobb is. Viszont a kijövő eredmény ez:
./Horror/Csontevő - 2007.avi, AVI, 705 MiB, 1h 24mn,
16:9, XviD, 608x336,
MP3, 2, MS Stereo, 128 Kbps, ,
Ezt most jó lenne összefűznöm egy sorrá. De a buktatója ott van hogy ebből egymás alatt rengeteg van a txt fájlban.:
./Horror/Csontevő - 2007.avi, AVI, 705 MiB, 1h 24mn,
16:9, XviD, 608x336,
MP3, 2, MS Stereo, 128 Kbps, ,
./Horror/Veszélyes kívánságok - 2002.avi, AVI, 1.32 GiB, 1h 37mn,
16:9, XviD, 672x384,
, 6, CM (complete main), 448 Kbps, ,
./Horror/Halálnak halála - 2002.avi, AVI, 699 MiB, 1h 30mn,
1.905, DivX 3 Low, 640x336,
MP3, 2, MS Stereo, 128 Kbps, ,
./Horror/Az árva - 2009.avi, AVI, 1.37 GiB, 1h 57mn,
16:9, DivX 5, 608x336,
, 6, CM (complete main), 384 Kbps, ,
Vagyis minden ./ kezdődő sor az első sor, és ahhoz kell hozzáfűzni az alatta lévő még kettőt. A végeredmény ez lenne:
./Horror/Csontevő - 2007.avi, AVI, 705 MiB, 1h 24mn,16:9, XviD, 608x336,MP3, 2, MS Stereo, 128 Kbps, ,
./Horror/Veszélyes kívánságok - 2002.avi, AVI, 1.32 GiB, 1h 37mn,16:9, XviD, 672x384,, 6, CM (complete main), 448 Kbps, ,
./Horror/Halálnak halála - 2002.avi, AVI, 699 MiB, 1h 30mn,1.905, DivX 3 Low, 640x336,MP3, 2, MS Stereo, 128 Kbps, ,
./Horror/Az árva - 2009.avi, AVI, 1.37 GiB, 1h 57mn,16:9, DivX 5, 608x336,, 6, CM (complete main), 384 Kbps, ,
A vesszőkre szükség van, mivel ezek után megy a táblázatkezelőbe csv importálás útján. S remélhetőleg az egyforma adatok egymás alatt lesznek.
ha tudsz phpban akkor ittvan mediainfo modul: https://github.com/mhor/php-mediainfo
igy legalabb nemkell videonkent 12szer futtatni a mediainfot
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
Így talán egyszerűbb:
$ cat /tmp/template.txt
General;%CompleteName% - %Format%,%FileSize/String%,%Duration/String%,
Video;%DisplayAspectRatio/String%,%CodecID/Hint%,%Width%x%Height%,
Audio;%CodecID/Hint%,%Channels%,%Format_Settings_ModeExtension%,%BitRate/String%,%Language%
File_End;\n
$ find -type f -exec mediainfo --Inform=file:///tmp/template.txt {} +
Húúú. Ez lesz az. Nekem ez így már nagyon is megfelel. Köszi.
Látom jól körbelőttük ezt a témát. Bár az utolsó find paranccsal minden fájlra rákeres, ha csak az avi kell, akkor ahhoz így módosítottam:
find -name "*.avi" -exec mediainfo --Inform=file:///tmp/template.txt {} +