답변:
다음과 같은 여러 가지 전용 프로그램이 있습니다
적절한 방향으로 도구를 선택하고 명령 행에서 변환 할 파일 이름을 전달하십시오.
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
' _ {} +