Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从多个视频中提取元数据_Linux_Bash_Video_Sed_Metadata - Fatal编程技术网

Linux 从多个视频中提取元数据

Linux 从多个视频中提取元数据,linux,bash,video,sed,metadata,Linux,Bash,Video,Sed,Metadata,我面临的挑战需要bash的多个方面。我在Linux(Debian Stretch)中工作。以下是情况(对于我现在考虑的解决方案,我写下的所有要点/问题,但我愿意接受其他想法): 我有各种类型的视频(和各种大小写),如.mp4、.mov、.mov、.mp4、.avi、,。。。位于一个目录中(并且分布在几乎没有结构的目录树中)。要查找所有内容,我尝试使用find命令 对于每个视频,我需要提取一些元数据(即文件名、视频持续时间、文件大小和创建/上次修改日期)。包mediainfo产生(在许多其他东西

我面临的挑战需要bash的多个方面。我在Linux(Debian Stretch)中工作。以下是情况(对于我现在考虑的解决方案,我写下的所有要点/问题,但我愿意接受其他想法):

  • 我有各种类型的视频(和各种大小写),如.mp4、.mov、.mov、.mp4、.avi、,。。。位于一个目录中(并且分布在几乎没有结构的目录树中)。要查找所有内容,我尝试使用
    find
    命令

  • 对于每个视频,我需要提取一些元数据(即文件名、视频持续时间、文件大小和创建/上次修改日期)。包
    mediainfo
    产生(在许多其他东西中)所需的字段。
    mediainfo
    的输出是一长串字段,格式为:
    \t:
    。我需要为字段全名、持续时间、文件大小和编码日期提取值

  • 因此,有了所有这些信息,我必须过滤所需的字段值,并将它们放入CSV文件中。我考虑过使用
    sed

我的目标是通过脚本或少量单独的命令来完成所有这些任务

idea代码(此代码大错特错,但您可以得到一个想法):

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