모두가 알고 있습니다 :-) Windows 일반 텍스트 파일에서는 행이 CR+LF로 끝나지만 Unix&Linux에서는 LF로만 끝납니다. 모든 소스 코드 파일을 한 형식에서 다른 형식으로 빠르게 변환하는 방법은 무엇입니까?
답변1
상황에 따라 다릅니다. 파일이 버전 제어 대상인 경우 이는 기록 오염 결정으로 인기가 없을 수 있습니다. Git에는 체크아웃할 때 자동으로 줄 끝을 변환하는 옵션이 있습니다.
신경 쓰지 않고 빠른 변환을 원한다면 fromdos
/ todos
및 dos2unix
/ 와 같은 프로그램을 사용하여 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