2013-12-12 9 views
0

unix2dos을 C++ 소스 코드 파일 그룹에 사용하려고합니다. 기본적으로 unix2dos은 LF를 CRLF로 변환합니다.for loop/unix2dos가 특정 확장자를 가진 파일 그룹을 정리합니다.

단순히 다음을 할 수있는, 그리고 내가 원하는 것을 :

#!/bin/sh 
find . -type f \(-name "*.h" -o -name "*.cpp" \) -exec unix2dos {}\; 

하지만 이미 라인의 CRLF 끝이있는 경우 나 파일이 수정되고 싶지 않아. 그런 이유로 나는 원본을 변경해야한다.

#!/bin/sh 
for i in `find . -type f \(-name "*.h" -o -name "*.cpp" \)` 
do 
    LINE=`file $i | grep CRLF` 
    if [ $? -eq 1 ] 
    then 
    unix2dos $i 
    fi 
done 

for 루프는 공간이 제대로 처리되지 않기 때문에 사용하기 조금 어려운 것 같습니다. 파일 이름에 공백이 있으면 셸이 스플릿 문자열에 unix2dos를 잘못 적용하려고합니다.

어떻게 문제를 해결할 수 있습니까?

답변

1

은 간단히 다음 (putnamhill 상단에서 제공)로 unix2dos 명령을 변경 (^M\r 문자입니다) 모든 설정.

+0

아주 좋습니다. perl을 사용하지 않고'unix2dos'의 별칭을 재정의하고 필요할 경우에만 적용하는 것이 좋다고 생각합니다. 'find -exec'은 나를위한 가장 자연스러운 형태입니다. –

1
  • 찾기 명령의 출력을 for 루프에서 처리하면 안됩니다.

  • 셸에서 변수를 올바르게 인용해야합니다.

대신이 코드를보십시오 :

#!/bin/sh 
find . -type f \(-name "*.h" -o -name "*.cpp" \) | while read i 
do 
    LINE=`file "$i" | grep -c CRLF` 
    if [ $LINE -eq 0 ] 
    then 
    unix2dos "$i" 
    fi 
done 

UPDATE : 당신은 BASH를 사용하기로 결정한다면보다 효율적으로 반복 수행 할 수 있습니다. 다음 코드를 고려 :

#!/bin/bash 
while read file 
do 
    grep -q $'\r'"$" "$file" && unix2dos "$file" 
done < <(find . -type f \(-name "*.h" -o -name "*.cpp" \)) 

< <(...) 구문은 현재 쉘 자체 루프 따라서 당신이 현재 쉘 프로세스에서의 shel 변수를 설정할 수 및 하위 쉘 창조의 포크 (fork)을 저장하는 동안 위하게 process substitution라고합니다. 그것은 CR 선행되지 않은 LF 전에 CR을 삽입합니다

#!/bin/sh 
find . -type f \(-name "*.h" -o -name "*.cpp" \) -exec perl -pi -e 's/([^\r])\n/$1\r\n/' "{}"\; 

:

+0

그러나 당신이'while' 루프를 사용했다. 'for' 루프를 사용하면 무언가를하고 싶지 않지만 왜 그런지 모르겠습니다. –

+0

어쨌든 고마워요. –

+0

네가 보여준 것처럼'while' 루프를 수행하는 것은 파일 이름이 공백이나 개행 문자를 포함 할 수있는 올바른 방법입니다. – anubhava

3

당신은 변경되지 CRLF 파일을 남겨 두어야 다음 펄을 사용할 수 있습니다.

1

이 같은 파일이 \r을 포함하는 경우 grep 확인하고 조건부 unix2dos를 실행할 수 있습니다 :

find . -type f \(-name "*.h" -o -name "*.cpp" \) -exec sh -c 'grep -q ^M "{}" && dos2unix "{}"' \; 

을 ... 당신이 제어-V를 눌러 입력에 의해 ^M를 입력 곳. 그런 다음 이전 find 명령 할

`perl -wpi -e 's/([^\r])\n/$1\r\n/g' $1`; 

:

#!/bin/sh 
find . -type f \(-name "*.h" -o -name "*.cpp" \) -exec unix2dos {}\; 

을 그리고 당신이

+0

'^ M '이 무엇인지 설명해주십시오. –

+0

'\ r'문자입니다. – janos

0

Unix2dos는 LF를 CRLF로 변경하지만 CRLF는 CRCRLF로 변경되지 않습니다. 기존의 DOS 줄 바꿈은 변경되지 않습니다. 그래서 당신이 원하는 것을 할 수있는 가장 간단한 방법은 다음과 같습니다

unix2dos를 * .H * cpp를

안부, 어윈

+0

이미 괜찮 으면 파일을 전혀 수정하지 않으려합니다. "깨끗한 파일"에 unix2dos를 적용하면 소스 코드 컨트롤에서 파일이 변경되었음을 감지 할 수 있습니다. –