如何捕获bash脚本的输出并将其导入另一个?

时间:2017-10-12 14:50:49

标签: linux bash youtube type-conversion

在我的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格式,从而创建一个完全自动化的过程。您如何捕获视频标题的名称并将其导入其他脚本?

3 个答案:

答案 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命令一样。