Linux 将值解析为Shell Bash脚本
我正在尝试为一个命令制作一个简单的bash脚本,这样我就可以对它进行重用。该命令是从另一篇文章中获取的,用于使用ffmpeg转换视频,然后上传 这是我到目前为止所拥有的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
#!/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
第一个非选项参数时tosh
设置为$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我已经更新了答案,以显示什么有用导出似乎起到了作用我不知道为什么要在上传视频时做些研究。