HandBrakeCLI bash脚本转换文件夹中的所有视频

时间:2013-10-24 10:00:42

标签: bash video handbrake

首先,我搜索了我的问题。但没有人能解决它。

我想转换目录中的所有视频文件,输出将保存在另一个目录中。我从一个我不记得的地方得到了一个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编码方面没有任何经验..所以,正确的脚本giiven将会欣赏:)

5 个答案:

答案 0 :(得分:3)

你的行

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

答案 1 :(得分:2)

我尝试过这个脚本,其他人喜欢它,但我想转换递归目录树,并将文件放在同一目录下,扩展名为.mp4并删除.avi文件,经过多次试验和错误我放弃了这段代码并搜索了一个新代码,ID就像信用

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

原始代码!

这是我修改过的脚本,勉强修改BTW这个脚本简短,甜美,易于理解。

private String data[][];
private int size;
private int last_line;

Games() {
    data = new String[100][2];
    size = 0;
    last_line = 0;
}

public void addTitle() {
    Scanner input = new Scanner(System.in);
    String title;
    int rating = -1;
    System.out.print("Enter the title of the game:");
    title = input.next();
    System.out.print("Enter the rating of " + title + ":");
    rating = input.nextInt();
    while (rating > 5 || rating < 0) {
        System.out.println("Invalid entry. Please enter the rating from 0 to 5");
        rating = input.nextInt();
    }
    data[last_line][0] = title;
    data[last_line][1] = String.valueOf(rating);
    this.last_line++;
    this.size++;
}

public double getAverage(String key) {
    int rating_count = 0;
    int number = 0;
    double average;
    for (int i = 0; i < size; i++) {
        if (data[i][0].equalsIgnoreCase(key)) {
            rating_count += Integer.parseInt(data[i][1]);
            number++;
        }
    }
    average = rating_count / number;
    return average;
}

public static void main(String[] args) {
    // TODO code application logic here
}

警告:这将转换为删除文件树上的所有.AVI文件!

随意删除

#!/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和删除.avi或修改以适应其他扩展程序。

干杯,希望这有助于某人!

答案 2 :(得分:1)

我找到了解决方案:

#!/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

答案 3 :(得分:0)

我刚尝试使用此脚本以及上面建议的修改。我发现我需要在$ FILE的两次使用中加上双引号,以便处理带空格的文件名。

因此...

filename = $(basename“$ FILE”)

$ HANDBRAKE_CLI -i“$ SRC”/“$ FILE”-o“$ DEST”/“$ filename”。$ DEST_EXT“$ PRESET”

答案 4 :(得分:0)

我更喜欢这种解决方案:

#!/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