以下命令告诉我 mp4 视频文件的长度:
find -type f -name "*.mp4" -print0 | \
xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | \
perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | \
tail -n 1
有人可以解析它并解释为什么它是这样的吗?
了解如何一次又一次地使用它而不需要重新输入或通过复制粘贴也会很有帮助。
答案1
find -type f -name "*.mp4" -print0
递归搜索当前目录中名称以 结尾的普通文件.mp4
,并打印其相对路径名,以空字节分隔。-print0
比这里更安全-print
,因为换行符是文件名中的有效字符。查找(1)
| xargs -0
使用输入作为下一个命令的参数。输入以空值分隔。xargs(1)
mplayer -vo dummy -ao dummy -identify 2>/dev/null
这是正在运行的命令xargs
。使用虚拟视频和音频驱动程序,以易于解析的格式显示文件参数。丢弃 STDERR 的任何输出。播放器(1)
| perl -nle
将输出通过管道传输到 Perl。 Perl 会将输入行读入$_
变量,并从末尾剥离换行符。佩尔伦(1)
/ID_LENGTH=([0-9\.]+)/
如果该行与此正则表达式匹配,则捕获“ID_LENGTH =”后面的数字,
&& ($t +=$1)
然后将变量增加$t
第一场比赛中捕获的数量,
&& printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60'
并从 计算小时、分钟和秒$t
,这是秒数。由于-l
在 perl 调用中,换行符会自动添加到print
语句中,但不会添加换行符printf
,因此格式字符串包含一个 ("\n")。
| tail -n 1
只打印输出的最后一行。尾巴(1)
要使该管道成为单个命令,您可以在您的 shell.bashrc
或您的 shell 使用的任何 rc 文件中创建一个 shell 函数。这是一个例子:
vid_lengths() {
find -type f -name "*.mp4" -print0 \
| xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null \
| perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' \
| tail -n 1
}