유닉스와 Windows 줄 바꿈 형식 사이에서 파일 시스템 분기의 모든 파일을 대량으로 변환하는 방법은 무엇입니까?


14

모든 사람들은 :-) Windows에서 일반 텍스트 파일 행이 CR + LF로 종료되고 Unix & Linux에서 LF로만 종료된다는 것을 알고 있습니다. 모든 소스 코드 파일을 한 형식에서 다른 형식으로 빠르게 변환하는 방법은 무엇입니까?

답변:


17

파일이 버전 제어하에있는 경우 이는 다소 인기가없는 기록 오염 결정일 수 있습니다. 힘내는 체크 아웃시 자동으로 줄 끝을 변환하는 옵션이 있습니다.

신경 쓰지 않고 빠르게 변환하려면 fromdos/ todosdos2unix/ 와 같은 프로그램 unix2dos이 있습니다. 사용할 수 있습니다 find: find . -type f -name '*.php' -exec dos2unix '{}' +.


7

다음과 같은 여러 가지 전용 프로그램이 있습니다

적절한 방향으로 도구를 선택하고 명령 행에서 변환 할 파일 이름을 전달하십시오.


Linux 또는 Cygwin이 없지만 Linux 또는 Cygwin이있는 경우 :

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

펄이 있다면 :

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

POSIX 도구 (BusyBox 포함) 만 사용하여 유닉스에서 작업으로 이동하려면 sed 명령에서 문자 그대로 CR 문자를 전달해야합니다.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

다른 방향으로는 모든 CR을 간단히 삭제할 수 있습니다.

tr -d '\r' <filename >filename.dos
mv filename.dos filename

와일드 카드를 사용하여 같은 디렉토리에있는 많은 파일을 한 번에 변환 할 수 있습니다. 예 :

sed -i -e 's/\r\+$//' *.txt

현재 디렉토리와 하위 디렉토리의 모든 파일을 변환하려면 쉘이 zsh 인 경우 다음을 사용할 수 있습니다 **/.

sed -i -e 's/\r\+$//' **/*.txt

**/bash ≥4에서 사용할 수 있지만 shopt -s globstar먼저 실행해야합니다 (이 줄을에 넣으십시오 ~/.bashrc). **/ksh93에서 사용할 수 있지만 set -o globstar먼저 실행해야합니다 (이 행을에 입력하십시오) ~/.kshrc.

리디렉션이 필요한 도구 만 사용할 수있는 경우 for루프를 사용하십시오 .

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

**/변환 할 파일을 선택하기 위해보다 복잡한 일치가 필요 하지 않은 경우 find명령을 사용하십시오 . 다음은이라는 .o하위 디렉토리 아래의 파일을 제외하고 현재 디렉토리 및 해당 하위 디렉토리 아래의 모든 파일을 재귀 적으로 변환하는 Linux / Cygwin 예제입니다 bin.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

다음은 POSIX 예입니다. 우리에게 find필요한 리디렉션을 수행 할 수있는 쉘을 시작합니다.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

find쉘 명령에서 루프를 사용하면 더 복잡한 코드를 희생 하면서 메소드를 약간 더 빠르게 만들 수 있습니다 .

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +

2

WinSCP에 의지 또한 자동 변환, 경우에 이렇게 말했다 .

파일이 모두 같은 디렉토리에있는 경우 :

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

WinSCP를 통해 달성하는 방법에 대해 좀 더 설명해 주시겠습니까?
harish sharma

@harishsharma 나는 "그래서 그렇게"링크를 추가했습니다.
Nils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.