2017-01-16 80 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