Unix와 Windows 개행 형식 간의 파일 시스템 분기에 있는 모든 파일을 일괄 변환하는 방법은 무엇입니까?

Unix와 Windows 개행 형식 간의 파일 시스템 분기에 있는 모든 파일을 일괄 변환하는 방법은 무엇입니까?

모두가 알고 있습니다 :-) Windows 일반 텍스트 파일에서는 행이 CR+LF로 끝나지만 Unix&Linux에서는 LF로만 끝납니다. 모든 소스 코드 파일을 한 형식에서 다른 형식으로 빠르게 변환하는 방법은 무엇입니까?

답변1

상황에 따라 다릅니다. 파일이 버전 제어 대상인 경우 이는 기록 오염 결정으로 인기가 없을 수 있습니다. Git에는 체크아웃할 때 자동으로 줄 끝을 변환하는 옵션이 있습니다.

신경 쓰지 않고 빠른 변환을 원한다면 fromdos/ todosdos2unix/ 와 같은 프로그램을 사용하여 unix2dos수행할 수 있습니다. 당신은 그것을 사용할 수 있습니다 find: find . -type f -name '*.php' -exec dos2unix '{}' +.

답변2

다음과 같은 다양한 전문 프로그램이 있습니다.

적절한 방향의 도구를 선택하고 명령줄에서 변환하려는 파일 이름을 전달하기만 하면 됩니다.


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

BusyBox를 포함한 POSIX 도구만 사용하여 unix에서 dos로 이동하려면 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에서 사용할 수 있지만 먼저 실행 **/해야 합니다 (이 줄을 에 넣을 수 있습니다 ). ksh93에서 사용할 수 있지만 먼저 실행 해야 합니다 (이 줄을 .shopt -s globstar~/.bashrc**/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
' _ {} +

답변3

윈스프다음과 같은 경우에도 자동으로 변환됩니다.그래서 말했다.

파일이 모두 동일한 디렉터리에 있는 경우:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

답변4

다음에서 변경됨CRLF 줄 종결자가 있는 ASCII 텍스트도착하다ASCII 텍스트

VIM - Vi 개선된 8.0(2016년 9월 12일, 2018년 4월 10일 21:31:58에 편집됨)


현재 디렉터리의 모든 파일

for i in *; do vi -c "set fileformat=unix | wq" "${i}"; done

특정 마스크(현재 디렉토리에서 "file"이라는 단어로 시작하는 모든 파일 이름)

for i in file*; do vi -c "set fileformat=unix | wq" "${i}"; done

또 다른 마스크("file"이라는 단어가 포함된 현재 디렉터리의 모든 파일 이름)

for i in *file*; do vi -c "set fileformat=unix | wq" "${i}"; done

파일을 다시 CRLF로 변환하려면 fileformat=unix를 fileformat=dos로 변경하면 됩니다.

for i in *file*; do vi -c "set fileformat=dos | wq" "${i}"; done

이것은 vim을 사용하여 파일 형식을 변환하는 가장 빠른 방법입니다.


또는 sed를 사용하여 CTRL+V를 누른 다음 CTRL+M을 눌러 모든 ^M을 삭제할 수 있습니다.

for i in *; do sed -i s/^M// "$i"; done

또는

for i in *; do sed -i s/^M// "${i}"; done

또한 현재 디렉터리의 모든 CRLF 파일이 ASCII 텍스트로 변경됩니다.

관련 정보