簡體   English   中英

(standard_in) 1: 非法字符:^M - dos2Unix 不工作?

[英](standard_in) 1: illegal character: ^M - dos2Unix not working?

我的腳本是:

#!/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 上寫的。 然后我在 Win8 x64 上安裝了 cygwin 並嘗試運行該腳本。 我收到錯誤:

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

(standard_in) 1: 語法錯誤

我查了一下,發現主要是DOS下的unix字符造成的,反之亦然。 我在文件durationAdder.sh (我的腳本)上運行了dos2unix ,輸出表明轉換成功。 但我仍然不斷收到錯誤消息。 這是為什么,我該如何解決?

為了將來參考,我正在為可能面臨同樣問題的任何其他可憐的靈魂發布我自己的答案。

問題是我預編譯的 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}"

謝謝大家的時間和答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM