2017-03-08 5 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에있는'echo'에 대한 POSIX 사양조차도 대신 printf를 사용하도록 권고합니다 - 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 ++로 열면 3 열 형식으로 멋지게 열립니다. 캐리 리턴의 문제를 어떻게 해결할 수 있는지 말해주십시오. –

관련 문제