2017-03-08 2 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

'echo'のPOSIX仕様でさえ、http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.htmlでは、代わりに' printf'を使うことを勧めます - アプリケーションの使用法と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

私は同じ問題があります。私は3列のテキストファイルを作成しています。私はosgeoを使用してウィンドウ上でbashを使用しています。私はbashのテキストファイルに私のデータを作成するとき私は私のデータセットのあいまいな配列を生成します。このテキストファイルをnodepad ++に開くと、3列の形式でうまく開くようになります。キャリーリターンの問題をどうやって解決できるのか教えてください。 –

関連する問題