bash脚本一次选择多个文件格式以进行编码过程



我有一个我下载的bash脚本(可行)可以使用handbrake-cli进行一些视频转换,但目前只允许一次从单个文件格式转换为AVI到MKV仅有的。我希望能够将其转换为任何类型的输入文件(AVI,WMV,FLV ... to MKV),而不是每次输入格式每次更改脚本。如何调整BASH脚本以允许此操作?

因此,如何使用行 input_file_type =" avi" input_file_type =" Avi,Wmv,flv,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 "nn"
done
echo "DONE CONVERTING FILES"

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

find "$source_dir" -type f -regex ".*.(avi|wmv|flv|mp4)" -print0 | while IFS= read -r -d $'' 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 $'' in_file
    do
    done
done

为了正确处理包含空格和新线字符的文件名,您应该使用NULL划界输出。这就是-print0read -d $''的目的。

您可以在find Lane中使用或(-o)操作员。

,例如

find "$source_dir" -name *.avi -o -name *wmv -o -name *.flv -o -name *.mp4 | while read in_file

如果由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 "nn"
done

这是可能帮助他人的最终代码,对我不知道如何在此处粘贴bash脚本的链接,而没有格式弄乱

链接到最终代码

#!/bin/bash
###############################################################################
#execute using bash mkvconv.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_types - Input file types to search for
#
#   output_file_type  - Output file type to convert into
#
#
# Change log:
# 2014-01-27: Initial release.  Tested on ubuntu 13.10.
#http://stackoverflow.com/questions/21404059/bash-script-to-select-multiple-file-formats-at-once-for-encode-process/21404530#21404530
###############################################################################
hbcli=HandBrakeCLI
source_dir="/media/rt/1tera_ext/1_Video_Stuff/1 Nova and bbc/Carbon diamonds"

input_file_types=(avi wmv flv mp4 webm mov mpg)
output_file_type="mkv"
echo "# Using HandBrakeCLI at "$hbcli
echo "# Using source directory " "$source_dir"
echo "# Converting "$input_file_types" 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"; # dont use with preses things are left out
        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
}
# loop over the types and convert
for input_file_types in "${input_file_types[@]}"
do
        # 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
        find "$source_dir" -name "*.$input_file_types" -print0 | while IFS= read -r -d $'' in_file
        #In order to correctly handle filenames containing whitespace and newline characters, you should use null delimited output. That's what the -print0 and read -d $'' is for.
        do
                echo "Processing…"
                echo ">Input  "$in_file
                # Replace the file type
                out_file=$(echo $in_file|sed "s/(.*.)$input_file_types/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 "nn"
        done
done
echo "DONE CONVERTING FILES"

相关内容

  • 没有找到相关文章

最新更新