2012-05-17 6 views

답변

7

당신의에게 자리에서 파일을 변경하는 -i 플래그를 나오지도 사용할 수 있습니다

find . -type f -exec sed -i 's/\x0d//g' {} \+ 

내가 당신이라면,이 작업이 괜찮 갔다 확인하기 위해 주위에 파일을 보관합니다. 그런 다음 임시 파일을 삭제할 수 있습니다. 다음과 같이 수행 할 수 있습니다.

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ 
find . -type f -name '*.OLD' -delete 
+0

공백이 포함 된 파일 이름을 처리해야합니다. 각 라인의 끝 부분에 개행을 추가하지 않으면 파일이 이중 간격 또는 3 중 간격이됩니다 (캐리지 리턴을 개행으로 바꾸므로). 예, 방금 테스트했습니다. –

+0

@DennisWilliamson 나는 두 번 생각조차하지 않고 사무실에있는 스크립트에서 방금 그걸 잡아 당겼다. 이제 그 스크립트가 어떻게 작동하는지 궁금합니다. (Mac 용 Microsoft Office에서 작성된 파일을 변환하기위한 것이라는 사실과 관련이있을 수 있습니다.) 새 버전이 제대로 작동해야합니다. –

2

공백없이 파일 이름 및 디렉토리 이름이 있습니까?

그렇다면 너무 어렵지 않습니다. 줄 바꾸기와 공백을 포함하는 임의의 이름을 처리해야한다면, 이보다 더 열심히해야합니다.

tmp=${TMPDIR:-/tmp}/crlf.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

find . -type f -print | 
while read name 
do 
    tr -d '\015' < $name > $tmp.1 
    mv $tmp.1 $name 
done 

rm -f $tmp.? 
trap 0 
exit 0 

트랩 구성 요소를 사용하면 임시 파일이 남지 않도록 할 수 있습니다. 임시 파일 이름에 임의의 이름을 사용하여 끌어낼 수있는 다른 트릭이 있습니다. 적대적인 환경에서 일하지 않는다면 보통 필요하지 않습니다. 당신이 펄 한 라이너와 함께 할 수있는 현재 디렉토리에있는 모든 파일의 경우

+0

'tr'은 실제로'\ r' (BSD와 GNU 변형 모두)을 인식하므로'tr -d '\ r "을 사용할 수 있습니다. –

11

: perl -pi -e 's/\r\n/\n/g' * (here에서 도난)

편집 :

find | xargs perl -pi -e 's/\r\n/\n/g' 
: 그리고 작은 수정하면 하위 디렉토리 재귀 작업을 수행 할 수 있습니다
+2

'find'와'xargs'가 그것을 지원하면 : find -print0 | xargs -0 ...'는 공백이있는 파일 이름을 처리합니다. –

+3

* Git * 저장소에서이 명령을 사용하면 조심하십시오. '.git' 서브 디렉토리를 find에서 제외하십시오. – prajmus

1

편집기를 배치 모드로 사용할 수도 있습니다. \r 만약

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 
+0

이 솔루션은 Mac OS X에서 저에게 잘 돌아간 유일한 해결책이었습니다. 다른 사람들은 'inplace do not inplace : ./lang은 일반 파일이 아니며, <> 22167 줄>과 같은 다양한 문제에 매달렸습니다. – WilliamKF

0

은 (팀 Pote의 파일에 어쩌면 경우) \n 다음되지 않습니다

  • \n\r를 대체 줄 바꿈을 제거 할 수있다 (tr -d 사용) \r을 삭제하지 않을 수 있습니다 더블/트리플 뉴 라인을 야기한다.

어쩌면 Tim Pote가 언급 한 파일에 대해 위의 사항을 확인할 수 있습니다.

+0

팀 포테 (Tim Pote)의 답변에 대한 좋은 코멘트로 보입니다. 그러나 실제로 질문에 대한 답변에 대해서는 분명하지 않습니다. –