2017-01-16 13 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}" 

내가 원래 우분투 16.04.1 LTS의 64에 썼다. Win8 x64에 cygwin을 설치하고 스크립트를 실행하려고했습니다. 나는 오류를 얻을 :

(standard_in) 1 : 잘못된 문자 : M

(standard_in) 1^: 구문 오류

나는 조금 검색하고 주로에 의한 것 발견 DOS에서는 유닉스 문자를, 그 반대의 경우도 마찬가지입니다. 파일 durationAdder.sh (내 스크립트)에서 dos2unix을 실행했는데 결과가 성공적인 변환을 제안했습니다. 하지만 여전히 오류가 계속 발생합니다. 왜 그런가요? 어떻게 수정합니까?

+0

'unix2dos'를 실행 해 봅니다. –

+0

@IporSircer 이미 시도했습니다. 유닉스 형식으로 변환했기 때문에 파일을 cygwin에서 전혀 실행할 수 없었다. 그런 다음 dos2unix를 사용하여 파일을 다시 변환했습니다. 원래는 내 파악을 벗어 났을 수도있는 모든 단일 문자를 포함하여 모든 승리 문자가 유닉스 형식으로 변환되었습니다. 하지만 그건 도움이되지 못했습니다. 나는 여전히 오류가 발생합니다. –

+0

스크립트가 저에게 효과적입니다. '^ M'은 ffprobe의 출력에있을 수 있습니다. – matzeri

답변

1

나중에 참조 할 수 있도록 동일한 문제에 직면 할 수있는 다른 불쌍한 영혼에 대한 내 대답을 게시하고 있습니다.

문제는 ffprobe가 cyfwin이 컴파일 할 수 없으므로 사전 컴파일되어 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