gpt4 book ai didi

linux - 将值解析为 Shell Bash 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:53 25 4
gpt4 key购买 nike

我正在尝试为命令制作一个简单的 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;

如果我这样运行第三个变量,我会遇到问题。

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。

任何帮助,这是我第一次尝试 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 是被执行的 script 的名称(在本例中是 sh-c 的参数),而不是结果脚本的第一个参数。请注意,错误消息并未提及名称中带有 sam 的文件,因此它是由 ${0%%.mov}.mp4 参数生成的 s3cmd,而不是使用 $BUCKET 的那个。将其替换为 $1。此外,您需要导出 BUCKET,以便 find 启动的 shell 可以访问它。 (文字字符串 $BUCKET,而不是它的值,通过其 -c 选项传递给 sh,因为该字符串正确地用单引号引起来。 )

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

#!/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 "${1%%.mov}.mp4" && s3cmd put "${0%%.mov}.mp4" "$BUCKET""$(basename "${0%%.mov}.mp4")"' {} \;
exit;

然而,在 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"

关于linux - 将值解析为 Shell Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com