2017-01-16 39 views
1

我的脚本是:(standard_in)1:非法字符:^ M - dos2Unix不工作?

#!/bin/bash 
LGREEN='\033[1;32m' 
LBLUE='\033[1;36m' 
NC='\033[0m' 

function convertToTime { 
    min=$(echo "$min+$sec/60" | bc) 
    sec=$(echo "$sec%60" | bc) 
    hrs=$(echo "$hrs+$min/60" | bc) 
    min=$(echo "$min%60" | bc) 
} 

function convertToTimeTotal { 
    totalMin=$(echo "$totalMin+$totalSec/60" | bc) 
    totalSec=$(echo "$totalSec%60" | bc) 
    totalHrs=$(echo "$totalHrs+$totalMin/60" | bc) 
    totalMin=$(echo "$totalMin%60" | bc) 
} 

totalSec=0 
totalMin=0 
totalHrs=0 

function recursiveDirFinder { 
    presentDir=$1 
    cd "$presentDir" 
    ls >filelist.tmp 
    sec=0 
    min=0 
    hrs=0 
    while 
     read fileName 
     do 
     if 
      test -d "$fileName" 
      then 
      presentDir+="/$fileName" 
      recursiveDirFinder "$presentDir" 
      presentDir=$1 
     else 
      if [[ $fileName == *.mp4 ]]; then 
       s=`ffprobe -v quiet -of csv=p=0 -show_entries format=duration "$fileName"` 
       sec=$(echo "$sec+$s" | bc) 
      fi 
     fi 
    done <filelist.tmp 
    convertToTime 
    echo -e "Video Duration in $1 is ${LBLUE}$hrs:$min:$sec${NC}" 
    totalSec=$(echo "$totalSec+$sec" | bc) 
    rm filelist.tmp 
    cd .. 
} 

recursiveDirFinder "E:/RBR Lectures" 
convertToTimeTotal 
echo -e "Total Duration is ${LGREEN}$totalHrs:$totalMin:$totalSec${NC}" 

我最初写这个在Ubuntu 16.04.1 LTS 64位。然后,我在Win8 x64上安装了cygwin,并尝试运行该脚本。我得到的错误:

(standard_in)1:非法字符:^ M

(standard_in)1:语法错误

我搜索了一下,发现它主要是由引起DOS下的unix字符,反之亦然。我在文件durationAdder.sh(我的脚本)上运行了dos2unix,输出建议成功转换。但我仍然不断收到错误。为什么是这样的,我该如何解决?

+0

尝试运行'unix2dos' –

+0

@IporSircer已经尝试过。它将它转换为unix格式,因此该文件无法由cygwin执行。然后,我使用dos2unix将文件转换回来(以确保所有赢得的角色,包括可能已经逃脱我的抓取的所有赢得角色最初转换为unix格式)。但那也没有帮助。我仍然得到错误。 –

+0

该脚本适用于我。可能是'^ M'在ffprobe的输出中,我没有? – matzeri

回答

1

为了将来的参考,我发布了我自己的答案,可能会面临同样问题的任何其他可怜的灵魂。

问题是ffprobe,我得到了预编译(因为cygwin无法编译它)以DOS格式输出。这cygwin不喜欢,并抛出一个错误。解决方案是将输出转储到文件ffpOut中,使用dos2unix以静默方式转换它,然后将输入反馈回相应的变量。

工作代码为:

LGREEN='\033[1;32m'; 
LBLUE='\033[1;36m'; 
NC='\033[0m'; 
function convertToTime { 
min=$(echo "$min+$sec/60" | bc); 
sec=$(echo "$sec%60" | bc); 
hrs=$(echo "$hrs+$min/60" | bc); 
min=$(echo "$min%60" | bc); 
}; 
function convertToTimeTotal { 
totalMin=$(echo "$totalMin+$totalSec/60" | bc); 
totalSec=$(echo "$totalSec%60" | bc); 
totalHrs=$(echo "$totalHrs+$totalMin/60" | bc); 
totalMin=$(echo "$totalMin%60" | bc); 
}; 
totalSec=0; 
totalMin=0; 
totalHrs=0; 
function recursiveDirFinder { 
presentDir=$1; 
cd "$presentDir"; 
ls >filelist.tmp; 
sec=0; 
min=0; 
hrs=0; 
while 
read fileName; 
do 
if 
test -d "$fileName" 
then presentDir+="/$fileName"; 
recursiveDirFinder "$presentDir"; 
presentDir=$1; 
else 
    if [[ $fileName == *.mp4 || $fileName == *.MP4 ]]; 
     then 
     `ffprobe -v quiet -of csv=p=0 -show_entries format=duration "$fileName">ffpOut` 
     dos2unix -q ffpOut 
     s=`cat ffpOut` 
     sec=$(echo "$sec+$s" | bc); 
     rm ffpOut 
    fi; 
fi; 
done <filelist.tmp; 
convertToTime; 
echo -e "Video Duration in $1 is ${LBLUE}$hrs:$min:$sec${NC}"; 
totalSec=$(echo "$totalSec+$sec" | bc); 
rm filelist.tmp; 
cd ..; 
}; 
recursiveDirFinder "E:/RBR Lectures"; 
convertToTimeTotal; 
echo -e "Total Duration is ${LGREEN}$totalHrs:$totalMin:$totalSec${NC}" 

谢谢大家的时间和你的答案。

+1

'ffprobe'行中的反引号没有意义。把它写成s = $(ffprobe -v quiet -of csv = p = 0 -show_entries format = duration“$ fileName”| dos2unix)' – user1934428