在我的Arch Linux PC上,我从官方存储库下载了包youtube-dl
。当我用它以mp4格式下载YouTube视频时,结果如下所示(我将使用'$'来表示shell提示符):
`$ youtube-dl --format mp4 https://www.examplelink.com`
[youtube] Q0CbN8sfihY: Downloading webpage
[youtube] Q0CbN8sfihY: Downloading video info webpage
[youtube] Q0CbN8sfihY: Extracting video information
[youtube] Q0CbN8sfihY: Downloading MPD manifest
[download] Destination: ExampleVideo.mp4
[download] 100% of 15.07MiB in 00:20`
我希望从此输出中捕获视频标题,并将其导入另一个脚本,如下所示:
`#! /bin/bash`
`track=`echo "$@"`
music='/home/samuel/Music/'
video='/home/samuel/Videos/'
ffmpeg -i "$video$track".mp4 -acodec libmp3lame -ab 160k -ar 44100 -ac 2 "$music$track".mp3`
这会将.mp4
文件转换为.mp3
格式,从而创建一个完全自动化的过程。您如何捕获视频标题的名称并将其导入其他脚本?
答案 0 :(得分:0)
您是否只是想知道如何捕获下载文件的名称?输出刚刚进入标准输出?假设您的脚本名称为nameIt
,请尝试此操作 -
youtube-dl --format mp4 https://www.examplelink.com 2>&1 |
tee whole.log | # save the whole log just in case
grep Destination: | # pass only the relevant line through
{ read x x file; nameIt $file }
大多数人会说使用awk - 我会让他们提供这样做的方法。
read / echo周围的{ ... }
是因为read
将var范围限定为管道。您可以将其传递给其他脚本,而不是回声。
您也可以将{ ... }
替换为sed 's/.* //'
并将其直接传递给您的其他脚本,然后在stdin上捕获它而不是期望它为$ 1,这看起来像这样:
youtube-dl --format mp4 https://www.examplelink.com 2>&1 |
tee whole.log | # save the whole log just in case
grep Destination: | # pass only the relevant line through
s/.* //' | # spit out the filename
nameIt # prog reads stdin
在哪种情况下代码,而不是
`track=`echo "$@"`
会说像
read track
有很多方法可以做到。
答案 1 :(得分:0)
您可以尝试以下方式: 第一行为您设置变量,然后我重命名并移动文件以删除空格(也可以应用于其他字符)
filename=$(youtube-dl --format mp4 https://www.youtube.com/watch?v=VgbnndezHbw|grep Destination|cut -f2 -d:)
echo "$filename"
newfilename="$(echo "$filename"|sed "s/^[ \t]*//"|tr ' ' '_')"
mv "$(echo "$filename"|sed 's/^ *//')" "$newfilename"
echo "$newfilename"
答案 2 :(得分:0)
更好的方法:
youtube-dl --exec 'echo "file: {}"' <<URL>>
我在这里只使用了一个echo作为示例,但您可以在下载后调用所需的任何函数,并使用大括号将文件名传递给它。就像find命令一样。