Linux 从多个视频中提取元数据
我面临的挑战需要bash的多个方面。我在Linux(Debian Stretch)中工作。以下是情况(对于我现在考虑的解决方案,我写下的所有要点/问题,但我愿意接受其他想法):Linux 从多个视频中提取元数据,linux,bash,video,sed,metadata,Linux,Bash,Video,Sed,Metadata,我面临的挑战需要bash的多个方面。我在Linux(Debian Stretch)中工作。以下是情况(对于我现在考虑的解决方案,我写下的所有要点/问题,但我愿意接受其他想法): 我有各种类型的视频(和各种大小写),如.mp4、.mov、.mov、.mp4、.avi、,。。。位于一个目录中(并且分布在几乎没有结构的目录树中)。要查找所有内容,我尝试使用find命令 对于每个视频,我需要提取一些元数据(即文件名、视频持续时间、文件大小和创建/上次修改日期)。包mediainfo产生(在许多其他东西
- 我有各种类型的视频(和各种大小写),如.mp4、.mov、.mov、.mp4、.avi、,。。。位于一个目录中(并且分布在几乎没有结构的目录树中)。要查找所有内容,我尝试使用
命令find
- 对于每个视频,我需要提取一些元数据(即文件名、视频持续时间、文件大小和创建/上次修改日期)。包
产生(在许多其他东西中)所需的字段。mediainfo
的输出是一长串字段,格式为:mediainfo
。我需要为字段全名、持续时间、文件大小和编码日期提取值\t:
- 因此,有了所有这些信息,我必须过滤所需的字段值,并将它们放入CSV文件中。我考虑过使用
sed
find-键入f-名称“*[mp4 | mp4 | mov | mov | avi | avi]”-exec mediainfo{}sed'/Complete name | Duration | File size | Encoded date/p'>myfile.csv\代码>
你知道如何完成这项任务吗?我觉得在结合查找、exec和sed并输出到csv时迷失了方向
提前感谢您的帮助 所以我终于写了一个这样的脚本。可能不是最好的方法,但这里是:
resFile=“myresult.csv”
dstDir=“./destination/”
srcDir=“./source/”
#首先在dstDir中复制同一级别的所有文件(带有保留和更新)
#这对于MOV文件和mediainfo来说是必要的相对名称
#他们似乎不在一起工作。
查找$srcDir-type f\(-name“*.mp4”-o-name“*.mov”-o-name“*.mov”-o-name“*.avi”\)-exec cp-up{}$dstDir\;
#然后,对于每个文件,输出文件的mediainfo并只保留感兴趣的标记。在每个文件之间添加###。
查找$dstDir-键入f \(-name“*.mp4”-o-name“*.mov”-o-name“*.mov”-o-name“*.avi”\
-exec sh-c“mediainfo--Output=XML{}sed'1,15!d;/Duration\\完成\ \文件大小\ \编码日期/!d'>$resFile&&echo'>$resFile;
#删除标记:42s 15ms->42s 15ms
sed-i的/^\(.*\)/\1/i'$resFile
#提取准确的文件名(而不是相对文件名)
sed-i的/^\.\/.*/\(.*)\.[mp4 | MOV | MOV | avi | mp4]/\1/'$resFile
#将文件的字段放在用逗号分隔的唯一行上
sed-i'N;s/\N/,/;N;s/\N/,/;N;s/\N/,/;N;s/\N/,/'$resFile
#移除所有拖缆###
sed-i的/,#*$/'$resFile
如果有人有改进代码的想法,我仍然很感兴趣。
我“最小化”了一点,我的实际代码更模块化,并执行了一些检查试试这个。由于时间较短,我无法完成。您只需将输出发送到CSV即可
for c in $(locate --basename .mp4 .mkv .wmv .flv .webm .mov .avi)
do
Complete_name=$(mediainfo --Output=XML $c | xml_grep 'Complete_name' --text_only| awk 'BEGIN{FS="/"}{print $NF}')
echo $Complete_name
Duration=$(mediainfo --Output=XML $c | xml_grep 'Duration' --text_only --nb_result 1)
echo $Duration
File_size=$(mediainfo --Output=XML $c | xml_grep 'File_size' --text_only)
echo $File_size
Encoded_date=$(mediainfo --Output=XML $c | xml_grep 'Encoded_date' --text_only -nb_result 1 | awk '{print $2}')
echo $Encoded_date
done
你知道吗,那个mediainfo
--Output=XML参数?也许解析XML会更容易,甚至使用它来代替CSV?对于可以使用的XML,我不知道,它可能确实更容易解析。谢谢。看起来不错。我需要一些时间来深入研究它,并更正一些细节,但它看起来很有效。非常感谢。
for c in $(locate --basename .mp4 .mkv .wmv .flv .webm .mov .avi)
do
Complete_name=$(mediainfo --Output=XML $c | xml_grep 'Complete_name' --text_only| awk 'BEGIN{FS="/"}{print $NF}')
echo $Complete_name
Duration=$(mediainfo --Output=XML $c | xml_grep 'Duration' --text_only --nb_result 1)
echo $Duration
File_size=$(mediainfo --Output=XML $c | xml_grep 'File_size' --text_only)
echo $File_size
Encoded_date=$(mediainfo --Output=XML $c | xml_grep 'Encoded_date' --text_only -nb_result 1 | awk '{print $2}')
echo $Encoded_date
done