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.
- 2185 megtekintés
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- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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- A hozzászóláshoz be kell jelentkezni
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é...
- A hozzászóláshoz be kell jelentkezni
.
- A hozzászóláshoz be kell jelentkezni
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- A hozzászóláshoz be kell jelentkezni
Bár rakná szépen egymás mellé...
Végén csinálhatsz sort-ot.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
#!/bin/bash
find -type f -name "*.avi" \
| while read i; do
echo -n "$(mediainfo --Inform=General\;%CompleteName% "${i}") - "
echo -n "$(mediainfo --Inform=General\;%Format% "${i}"),"
echo -n "$(mediainfo --Inform=General\;%FileSize/String% "${i}"),"
echo -n "$(mediainfo --Inform=General\;%Duration/String% "${i}"),"
echo -n "$(mediainfo --Inform=Video\;%DisplayAspectRatio/String% "${i}"),"
echo -n "$(mediainfo --Inform=Video\;%CodecID/Hint% "${i}"),"
echo -n "$(mediainfo --Inform=Video\;%Width%x%Height% "${i}"),"
echo -n "$(mediainfo --Inform=Audio\;%CodecID/Hint% "${i}"),"
echo -n "$(mediainfo --Inform=Audio\;%Channels% "${i}"),"
echo -n "$(mediainfo --Inform=Audio\;%Format_Settings_ModeExtension% "${i}"),"
echo -n "$(mediainfo --Inform=Audio\;%BitRate/String% "${i}"),"
echo -n "$(mediainfo --Inform=Audio\;%Language% "${i}"),"
echo
done >> movie.lst
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Í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 {} +
- A hozzászóláshoz be kell jelentkezni
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 {} +
- A hozzászóláshoz be kell jelentkezni