Linux bash脚本,用于为编码过程一次选择多个文件格式

Linux bash脚本,用于为编码过程一次选择多个文件格式,linux,bash,shell,sh,Linux,Bash,Shell,Sh,我下载了一个BASH脚本(可以运行),用handbrake CLI进行一些视频转换,但目前它只允许一次从单个文件格式转换为avi到mkv。我希望能够让它转换任何类型的输入文件(avi,wmv,flv…到mkv)所有在一次,而不是改变脚本每次为每个输入格式。如何调整bash脚本以允许此操作 那么,我如何才能使用带有行input\u file\u type=“avi”的bash脚本来处理input\u file\u type=“avi,wmv,flv,mp4” PS:我试着发布bash脚本,但是格式

我下载了一个BASH脚本(可以运行),用handbrake CLI进行一些视频转换,但目前它只允许一次从单个文件格式转换为avi到mkv。我希望能够让它转换任何类型的输入文件(avi,wmv,flv…到mkv)所有在一次,而不是改变脚本每次为每个输入格式。如何调整bash脚本以允许此操作

那么,我如何才能使用带有行input\u file\u type=“avi”的bash脚本来处理input\u file\u type=“avi,wmv,flv,mp4”

PS:我试着发布bash脚本,但是格式搞砸了,如果有人知道如何将bash脚本以正确的格式发布到论坛,请告诉我,我将在这里发布它,而不是下面的链接

[http://pastebin.com/hzyxnsYY][1]

将代码粘贴到此处:

#!/bin/sh

###############################################################################
#
# Script to recursively search a directory and batch convert all files of a given
# file type into another file type via HandBrake conversion.
#
# To run in your environment set the variables:
#   hbcli - Path to your HandBrakeCLI
#
#   source_dir - Starting directory for recursive search
#
#   input_file_type - Input file type to search for
#
#   output_file_type  - Output file type to convert into
#
#
# Change log:
# 2014-01-27: Initial release.  Tested on ubuntu 13.10.
#
###############################################################################

hbcli=HandBrakeCLI
source_dir="/media/rt/1tera_ext/1_Video_Stuff/1 Documentary"
#source_dir="/media/rt/1tera_ext/1_Video_Stuff/1 Nova and bbc/Carbon diamonds"



input_file_type="avi"
output_file_type="mkv"

echo "# Using HandBrakeCLI at "$hbcli
echo "# Using source directory " "$source_dir"
echo "# Converting "$input_file_type" to "$output_file_type

# Convert from one file to another
convert() {
        # The beginning part, echo "" | , is really important.  Without that, HandBrake exits the while loop.
        #echo "" | $hbcli -i "$1" -o "$2" --preset="Universal";
        echo "" | $hbcli -i "$1" -t 1 --angle 1 -c 1 -o "$2"  -f mkv  --decomb --loose-anamorphic  --modulus 2 -e x264 -q 20 --cfr -a 1,1 -E faac,copy:ac3 -6 dpl2,auto -R Auto,Auto -B 160,0 -D 0,0 --gain 0,0 --audio-fallback ffac3 --x264-profile=high  --h264-level="4.1"  --verbose=1
        #echo "" | $hbcli -i "$1" -t 1 --angle 1 -c 1 -o "$2"  -f mkv  --decomb -w 640 --loose-anamorphic  --modulus 2 -e x264 -q 20 --cfr -a 1,1 -E faac,copy:ac3 -6 dpl2,auto -R Auto,Auto -B 160,0 -D 0,0 --gain 0,0 --audio-fallback ffac3 --x264-profile=high  --h264-level="4.1"  --verbose=1

}

# Find the files and pipe the results into the read command.  The read command properly handles spaces in directories and files names.
find "$source_dir" -name *.$input_file_type | while read in_file
do
        echo "Processing…"
        echo ">Input  "$in_file

        # Replace the file type
        out_file=$(echo $in_file|sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g")
        echo ">Output "$out_file

        # Convert the file
        convert "$in_file" "$out_file"

        if [ $? != 0 ]
        then
            echo "$in_file had problems" >> handbrake-errors.log
        fi

        echo ">Finished "$out_file "\n\n"
done

echo "DONE CONVERTING FILES"
您可以在
find
通道中使用OR(
-o
)运算符

例如

您可以在
find
通道中使用OR(
-o
)运算符

例如


假设所有文件类型的转换命令都相同,您可以使用如下单个
find

find "$source_dir" -type f -regex ".*\.\(avi\|wmv\|flv\|mp4\)" -print0 | while IFS= read -r -d $'\0' in_file
do

done
或者,创建您感兴趣的文件类型数组,并在其上循环:

input_file_types=(avi wmv flv mp4)

# loop over the types and convert
for input_file_type in "${input_file_types[@]}"
do
    find "$source_dir" -name "*.$input_file_type" -print0 | while IFS= read -r -d $'\0' in_file
    do

    done
done

为了正确处理包含空格和换行符的文件名,应该使用空分隔的输出。这就是
-print0
read-d$'\0'
的作用。

假设转换命令对所有文件类型都是相同的,您可以使用单个
查找
,如下所示:

find "$source_dir" -type f -regex ".*\.\(avi\|wmv\|flv\|mp4\)" -print0 | while IFS= read -r -d $'\0' in_file
do

done
或者,创建您感兴趣的文件类型数组,并在其上循环:

input_file_types=(avi wmv flv mp4)

# loop over the types and convert
for input_file_type in "${input_file_types[@]}"
do
    find "$source_dir" -name "*.$input_file_type" -print0 | while IFS= read -r -d $'\0' in_file
    do

    done
done
为了正确处理包含空格和换行符的文件名,应该使用空分隔的输出。这就是
-print0
read-d$'\0'
的用途。

如果由bash运行:

#!/usr/bin/bash

input_file_type="avi|wmv|flv|mp4"

find "$source_dir" -type f|egrep "$input_file_type" | while read in_file
do
        echo "Processing…"
        echo ">Input  "$in_file

        # Replace the file type
        out_file=$(in_file%.*}.${output_file_type}   # replace file type with different command. 
        echo ">Output "$out_file

        # Convert the file
        convert "$in_file" "$out_file"

        if [ $? != 0 ]
        then
            echo "$in_file had problems" >> handbrake-errors.log
        fi

        echo ">Finished "$out_file "\n\n"
done
如果由bash运行:

#!/usr/bin/bash

input_file_type="avi|wmv|flv|mp4"

find "$source_dir" -type f|egrep "$input_file_type" | while read in_file
do
        echo "Processing…"
        echo ">Input  "$in_file

        # Replace the file type
        out_file=$(in_file%.*}.${output_file_type}   # replace file type with different command. 
        echo ">Output "$out_file

        # Convert the file
        convert "$in_file" "$out_file"

        if [ $? != 0 ]
        then
            echo "$in_file had problems" >> handbrake-errors.log
        fi

        echo ">Finished "$out_file "\n\n"
done

这是最后一段代码,可能会帮助其他人,很抱歉,我不知道如何在这里粘贴bash脚本,而不会把格式搞得一团糟


这是最后一段代码,可能会帮助其他人,很抱歉,我不知道如何在这里粘贴bash脚本,而不会把格式搞得一团糟


我得到一个语法错误:“(“行输入文件类型=(avi wmv flv mp4)中出现意外情况时,是否应该改为使用引号?不,您不需要引号。您可能没有使用
bash
(或使用旧版本),因此不支持数组。我得到一个语法错误:”(“行输入文件类型=(avi wmv flv mp4)中出现意外情况)是否应该改为使用引号?不,您不需要引号。您可能没有使用
bash
(或使用旧版本),因此不支持数组。