2017-03-08 53 views
0

我有一個文本文件done.txt,其中包含我需要執行某些操作的文件路徑。 這裏是我done.txt第一部分:從文本文件中讀取目錄時會發生變化

/data/voice/Voice27Folds/1000/1017_009.flac 
/data/voice/Voice27Folds/1000/1017_010.flac 
/data/voice/Voice27Folds/1000/1017_013.flac 
/data/voice/Voice27Folds/1000/1017_014.flac 
/data/voice/Voice27Folds/1000/1017_015.flac 
/data/voice/Voice27Folds/1000/1017_020.flac 
/data/voice/Voice27Folds/1000/1017_025.flac 
/data/voice/Voice27Folds/1000/1017_026.flac 
/data/voice/Voice27Folds/1000/1017_027.flac 
/data/voice/Voice27Folds/1000/1017_030.flac 

..... 

當我運行此命令:

while IFS= read -r var 
do 
echo "$var" 
done < /data/voice/done.txt 

我得到完全相同的東西done.txt:

/data/voice/Voice27Folds/1000/1017_009.flac 
/data/voice/Voice27Folds/1000/1017_010.flac 
/data/voice/Voice27Folds/1000/1017_013.flac 
/data/voice/Voice27Folds/1000/1017_014.flac 
/data/voice/Voice27Folds/1000/1017_015.flac 
/data/voice/Voice27Folds/1000/1017_020.flac 
/data/voice/Voice27Folds/1000/1017_025.flac 
/data/voice/Voice27Folds/1000/1017_026.flac 
/data/voice/Voice27Folds/1000/1017_027.flac 
/data/voice/Voice27Folds/1000/1017_030.flac 

.... 

然而,當我嘗試時:

while IFS= read -r var 
do 
mv "$var" /data/voice #move all files to this directory 
done < /data/voice/done.txt 

我得到噸目錄相關的錯誤像這樣的:

mv: cannot stat '/data/voice/Voice27Folds/1000/1017_009.flac\r': No such file and directory 
mv: cannot stat '/data/voice/Voice27Folds/1000/1017_013.flac\r': No such file and directory 

... 

我注意到,正確的目錄可能會與「\ R」追加到結尾變化。我該如何解決這個問題?

+2

將輸入文件從DOS轉換爲UNIX格式。 –

+1

不要相信'echo'真實地告訴你事情。 –

+1

即使在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html使用'printf'建議''echo'的POSIX規範,請參閱APPLICATION USAGE和RATIONALE部分。 (雖然這裏的特殊情況需要'printf'的非POSIX擴展)。 –

回答

3

$'\r'是一個回車符 - 一條指令,將光標發送回行的開頭。

在DOS(和Windows)上,文本文件的每一行以$'\r\n'(CRLF)結尾,而在UNIX上,每行僅以$'\n'結束。因此,在UNIX上讀取DOS文本文件時,每行似乎都有一個額外的$'\r'

因爲當echo打印該字符是將光標移動到行,而不是創建任何可見的輸出的開始,的後回車情況的存在不能與echo "$var"區分(除非你後打印任何東西 - - echo "[$var]"會將]放在行的開頭,而不是末尾)。如果要以顯示隱藏字符的明顯方式打印變量內容,請改爲使用printf 'var=%q\n' "$var"

while IFS= read -r var; do 
    var=${var%$'\r'}   # remove any trailing carriage return from var 
    mv -- "$var" /data/voice #move all files to this directory 
done < /data/voice/done.txt 
+0

我有同樣的問題。我正在創建一個三列的文本文件。我使用osgeo在窗口上使用bash。當我在bash中創建我的數據到文本文件時,我產生了模糊的數據集安排。當我打開這個文本文件到nodepad ++時,它以三列格式很好地打開。請告訴我如何解決隨機回報問題? –