2017-01-16 2 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 и наоборот. Я запустил dos2unix по файлу durationAdder.sh (мой скрипт), и на выходе было предложено успешное преобразование. Но я все еще продолжаю получать ошибку. Почему это и как я могу это исправить?

+0

попробуйте запустить 'unix2dos' –

+0

@IporSircer Пробовал это уже. Он преобразовал его в формат unix, поэтому файл не мог быть запущен cygwin вообще. Затем я преобразовал файл обратно с помощью dos2unix (чтобы гарантировать, что все символы выигрыша, включая каждый из них, который, возможно, ускользнул, первоначально были преобразованы в формат unix). Но это тоже не помогло. Я все еще получаю ошибку. –

+0

Сценарий работает для меня. Может быть, '^ M' в выводе ffprobe, чего у меня нет? – matzeri

ответ

1

В будущем я отправляю свой собственный ответ для любой другой бедной души, которая может столкнуться с той же проблемой.

Проблема заключалась в том, что ffprobe, который я предварительно скомпилировал (поскольку cygwin не смог его скомпилировать) выводил в формате DOS. Этот кигвин не понравился и ошибся. Решение заключалось в том, чтобы выгрузить вывод в файл 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

Смежные вопросы