Linux 将值解析为Shell Bash脚本

Linux 将值解析为Shell Bash脚本,linux,bash,shell,ffmpeg,Linux,Bash,Shell,Ffmpeg,我正在尝试为一个命令制作一个简单的bash脚本,这样我就可以对它进行重用。该命令是从另一篇文章中获取的,用于使用ffmpeg转换视频,然后上传 这是我到目前为止所拥有的 #!/bin/bash MOVIES=$1 EXT=$2 BUCKET=$3 find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp

我正在尝试为一个命令制作一个简单的bash脚本,这样我就可以对它进行重用。该命令是从另一篇文章中获取的,用于使用ffmpeg转换视频,然后上传

这是我到目前为止所拥有的

#!/bin/bash
MOVIES=$1
EXT=$2
BUCKET=$3
find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \;
exit;
如果我这样运行第三个var,我会遇到问题

sh batch.sh ~/Documents/screengrabs/ mov s3://bucket/
我得到一个错误,它正确编码

ERROR: Parameter problem: Destination must be S3Uri. Got: file://49A22352-9F41-48B9-BF97-610CBF699025-630-0000055828D0D55F.mp4
这意味着它没有正确解析$3参数$BUCKET

ERROR: Parameter problem: Destination must be S3Uri. Got: file://49A22352-9F41-48B9-BF97-610CBF699025-630-0000055828D0D55F.mp4
这是我第一次尝试bash脚本

谢谢

更新仍不工作

#!/bin/bash
MOVIES="$1"
EXT="$2"
BUCKET="$3"

find "$MOVIES" -name "*.${EXT}" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "${BUCKET}/sam.mp4"' {} \;

exit;
工作

#!/bin/bash
MOVIES=$1
EXT=$2
export BUCKET=$3
find "$MOVIES" -name "*.$EXT" -exec sh -c 'ffmpeg -i "$0" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "${0%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \;
exit;

问题在于,
$0
是执行的脚本的名称(在本例中是由
sh
-c
的参数创建的临时文件),而不是结果脚本的第一个参数。请注意,错误消息没有提到名称中带有
sam
的文件,因此它是由
s3cmd
${0%%.mov}.mp4
参数生成的,而不是使用
$BUCKET
的文件。将其替换为
$1
。此外,您还需要导出
BUCKET
,以便由
find
启动的shell可以访问它。(文本字符串
$BUCKET
,而不是它的值,通过它的
-c
选项传递给
sh
,因为该字符串是正确的单引号。)

(更新:正如埃坦指出的,
$0
是正确的。)

然而,在
bash
4中,我只需编写

#!/bin/bash
MOVIES=$1
EXT=$2
BUCKET=$3

shopt -s globstar
for movie in "$MOVIES"/**/*."$EXT"; do
    mp4movie=${movie%%.mov}.mp4
    ffmpeg -i "$movie" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "$mp4movie" &&
      s3cmd put "$mp4movie" "$BUCKET/$mp4movie"
done
对于
sh-c
,这比将一个小脚本塞进单个字符串要容易得多


使用
bash
3.2手动递归搜索:

process_file () {
    movie=$1
    mp4movie=${movie%%.mov}.mp4
    ffmpeg -i "$movie" -c:v libx264 -crf 22 -c:a libfaac -movflags faststart "$mp4movie" &&
      s3cmd put "$mp4movie" "$BUCKET/$mp4movie"
}

process_directory () {
    dir=$1
    for name in "$dir"/*; do
        if [[ -d "$name" ]]; then
            process_directory "$name"
        elif [[ -f $name && $name = *.$EXT ]]; then 
            process_file "$name"
        fi
    done
}

MOVIES=$1
EXT=$2
BUCKET=$3
process_directory "$MOVIES"

@chepner关于使用“本机”shell脚本的回答是很好的。话虽如此,正如我刚才在评论中所说,我相信这里的问题只是一个可变范围的问题


如果编辑脚本以在传递给
sh-c
的脚本中使用
“$1”
而不是
“$BUCKET”
,并在
{}
\之间添加
“$BUCKET”
我相信脚本会工作(尽管我还没有在其他方面对脚本进行全面评估)。

我认为使用变量MOVIES、EXT、BUCKET,比如“*.${EXT}”、“${BUCKET}”将代替$BUCKET、$EXT。好的,谢谢,我试试看;)如果我在${bucket}选项上硬编码s3://bucket/,那么仍然不走运。命令行参数也应该用引号括起来,如下所示:bucket=“$3”在赋值的RHS上引用单个参数扩展是不必要的,谢谢Chepner试图让它工作,但我只是得到了这个错误/Users/user/Documents/screengrabs/***。mov:没有这样的文件或目录对不起,我不知道bash脚本现在要看一些教程,当使用
-c
第一个非选项参数时to
sh
设置为
$0
。在正常使用中,这是脚本名称,但不包含一组显式的非脚本非选项参数
sh-c'echo“\$0:$0=$@”foo-bar-baz
输出
$0:foo=bar-baz
。谢谢,伊坦。我应该仔细检查一下。我想编辑我的答案,但考虑到奇怪的
文件:
URL,我不确定该编辑什么。@user1503606该错误表示您正在使用
bash
3.2(该目录表示您正在使用Mac OS X,其默认
bash
实际上是3.2),因此,除非您自己安装
bash
4,否则
globstar
不可用。@chepner我已经更新了答案,以显示什么有用导出似乎起到了作用我不知道为什么要在上传视频时做些研究。