2017-01-16 9 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 x64の上でこれを書いています。私はcygwinをWin8 x64にインストールし、スクリプトを実行しようとしました。私はエラーを取得:

(standard_in)1:不正な文字:M

(standard_in)1 ^:構文エラー

は、私は少しを検索し、それは主に起因していますことを発見UNIXの文字はDOSで、逆もまた同様です。私はファイル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

関連する問題