bash脚本一次为编码过程select多个文件格式

我有一个BASH脚本,我下载(工作)使用手刹CLI做一些video转换,但目前它只允许从一个单一的文件格式转换AVI到MKV只。 我希望能够一次性将所有types的input文件(avi,wmv,flv …转换为mkv),而不是每次为每个input格式更改脚本。 我如何调整bash脚本来允许这个?

那么我怎样才能得到这个bash脚本的input_file_type =“avi”来处理input_file_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

 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 

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

您可以在find通道中使用OR( -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 "\n\n" 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 $'\0' 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 $'\0' 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 "\n\n" done done echo "DONE CONVERTING FILES"