手刹CLAB脚本转换文件夹中的所有视频



首先,我四处寻找我的问题。但没有人能解决它。

我想转换一个目录中的所有视频文件,输出将保存在另一个目录中。我从我不记得的地方得到了一个 bash 脚本。

#!/bin/bash
SRC="/home/abc/public_html/filex/store/vids/toriko/VIDEOS HERE"
DEST="/home/abc/public_html/filex/store/vids/toriko/51-100"
DEST_EXT=mp4
HANDBRAKE_CLI=HandBrakeCLI
PRESET="iPhone & iPod Touch"
for FILE in "`ls $SRC`"
do
filename=$(basename $FILE)
extension=${filename##*.}
filename=${filename%.*}
$HANDBRAKE_CLI -i "$SRC"/$FILE -o "$DEST"/"$filename".$DEST_EXT "$PRESET"
done

问题是,文件的输出将没有文件名,只有".mp4"。并且,只生成了 1 个文件。 意味着,从文件夹中的 50 个视频中,只有 1 个文件名为".mp4"的文件生成,之后,HandBrakeCLI 退出。任何人都可以修复我的代码吗?我没有bash编码的经验。因此,正确的脚本将不胜感激:)

你的行

for FILE in "`ls $SRC`"

有效地只创建一个迭代,其中FILE包含文件列表(并且它无法处理$SRC中的空间)。最好用

for FILE in "$SRC"/*

例:

$ ls test
1.txt  2.txt
$ SRC=test; for f in "`ls $SRC`" ; do echo $f; done
1.txt 2.txt
$ SRC=test; for f in "$SRC"/* ; do echo $f; done
test/1.txt
test/2.txt

旁注:你可以在那里有一个空间,没有问题

$ ls "the test"
1.txt  2.txt
$ SRC="the test"; for f in "$SRC"/* ; do echo $f; done
the test/1.txt
the test/2.txt

我尝试了这个脚本,还有其他类似的脚本,但我想转换递归目录树并将文件放在扩展名.mp4同一目录中并删除.avi文件,经过多次试验和错误,我放弃了这段代码并搜索了一个新的代码,id 喜欢信用

http://www.surlyjake.com/blog/2010/08/10/script-to-run-handbrake-recursively-through-a-folder-tree/

对于原始代码!

这是我修改过的脚本,

几乎没有修改过,顺便说一句,这个脚本简短、甜美且易于理解。

#!/bin/bash
# This Script Goes in Root Folder of TV show -- Example Folder Structure
# /Stargate/Season 1/Epiosde.avi
# /Stargate/Season 2/Epiosde.avi
# /Stargate/handbrake_folder.script
# Outputs all Files back inside same dir's and does all folders inside Startgate DIR
# /Stargate/Season 1/Epiosde.mp4
# /Stargate/Season 2/Epiosde.mp4
# PRESET = -o flags for CLI can be got from GUI under Activity Log or from https://trac.handbrake.fr/wiki/CLIGuide OR you can use actual Presets!
# PRESET="iPhone & iPod Touch"
PRESET="--modulus 2 -e x264 -q 20 --vfr -a 1 -E ac3 -6 5point1 -R Auto -B 384 -D 0 --gain 0 --audio-fallback ac3 --encoder-preset=veryfast  --encoder-level="5.2"  --encoder-profile=high  --verbose=1"
if [ -z "$1" ] ; then
TRANSCODEDIR="."
else
TRANSCODEDIR="$1"
fi
find "$TRANSCODEDIR"/* -type f -name "*.avi" -exec bash -c 'HandBrakeCLI -i "$1" -o "${1%.*}".mp4 --preset="$PRESET"' __ {} ; && find . -name '*.avi' -exec rm -r     {} ;

请注意:这将转换然后删除文件树中脚本上方的所有.AVI文件!

随意删除

[-name "*.avi"] & [&& find . -name '*.avi' -exec rm -r     {} ;]

仅禁用转换.avi和删除.avi或修改以适应其他扩展。

我已经找到了解决方案:

#!/bin/bash
SRC="/home/abc/public_html/filex/store/vids/toriko/VIDEOS HERE"
DEST="/home/abc/public_html/filex/store/vids/toriko/51-100"
DEST_EXT=mp4
HANDBRAKE_CLI=HandBrakeCLI
for FILE in "$SRC"/*
do
    filename=$(basename "$FILE")
    extension=${filename##*.}
    filename=${filename%.*}
    $HANDBRAKE_CLI -i "$FILE" -o "$DEST"/"$filename".$DEST_EXT
done

我刚刚尝试使用这个脚本进行上面建议的修改。我发现我需要在$FILE的两种用法周围加上双引号,以便处理带有空格的文件名。

所以。。。

文件名=$(基本名称"$FILE")

$HANDBRAKE_CLI -i "$SRC"/"$FILE" -o "$DEST"/"$filename".$DEST_EXT "$PRESET"

我宁愿更喜欢这个解决方案:

#!/bin/bash
SRC="$1"
DEST="$2"
EXT='mp4'
PRESET='iPhone & iPod Touch'
#for FILE in "`ls $SRC`"; do
for FILE in `find . -type f`; do
    FILE=$(basename "$FILE")
    filename=$(basename "$FILE")
    extension=${filename##*.}
    filename=${filename%.*}
    HandBrakeCLI -i "$SRC"/$FILE -o "$DEST"/"$filename"."$EXT" "$PRESET"
done

最新更新