특정 유형의 모든 파일을 Unix 형식에서 Dos 형식으로 변환하는 Bash 스크립트

특정 유형의 모든 파일을 Unix 형식에서 Dos 형식으로 변환하는 Bash 스크립트

두 시스템 모두에서 개발하는 C++ 프로젝트를 위해 CentOS와 Windows 간에 전환할 수 있어야 합니다. Unix에서 Dos로 특정 유형(예: *.cpp, *.h 또는 *.txt)의 모든 파일을 변환할 수 있기를 원합니다.

단일 파일을 변환하는 bash 스크립트가 있지만 파일 유형의 확장자 또는 *.FILETYPE만 입력하여 해당 유형의 특정 디렉토리에 있는 모든 파일을 변환할 수 있기를 원합니다.

다음은 작업 스크립트입니다. 한 번에 여러 파일에서 작동하도록 하려면 어떻게 해야 합니까? for 루프를 사용해 보았으나 구문 오류가 발생했습니다.

#! /bin/sh

# Convert a text based file from Unix Format to Dos Format
# The Output file should be the name of the input file with
# WF inserted before the file extention
#
# Examples
#    convert Unix format abc.txt to abcWF.txt Windows Format 
#    convert Unix format abc.cpp to abcWF.cpp Windows Format 

echo "In u2w FileToConvert = $1"
    FileBase=$(basename $1)
    FileExtension="${FileBase##*.}"
    FileBase="${FileBase%.*}"
    OutputSuffix="WF.$FileExtension"
    OutputFile="$FileBase$OutputSuffix"
    commandment="unix2dos -n $1 $OutputFile"
    echo $commandment
    unix2dos -n $1 $OutputFile
    echo "diff -w $1 $OutputFile"
    diff -w "$1" "$OutputFile"

exit

예제 실행

$  bd2w TestResults.txt
In u2w FileToConvert = TestResults.txt
unix2dos -n TestResults.txt TestResultsWF.txt
unix2dos: converting file TestResults.txt to file TestResultsWF.txt in DOS format ...
diff -w TestResults.txt TestResultsWF.txt

답변1

유닉스에서 DOS로

*.h예를 들어 모든 파일을 DOS 형식으로 변환하려면 다음을 수행하십시오 .

sed -i '/\r/! s/$/\r/' *.h

이 조건은 /\r/!sed에게 이미 캐리지 리턴이 있는 모든 줄을 건너뛰도록 지시합니다. 따라서 동일한 파일에서 이 명령을 여러 번 실행하는 것이 안전합니다.

바꾸기 명령은 s/$/\r/각 줄의 끝에 캐리지 리턴 문자를 추가합니다.

이 옵션은 -ised에게 파일을 제자리에서 변경하라고 지시합니다. 원본의 백업을 유지하려는 경우:

sed -i.bak '/\r/! s/$/\r/' *.h

DOS에서 UNIX로

*.h모든 파일을 DOS에서 Unix로 내부 변환하려면 :

sed -i 's/\r$//' *.h

이 명령은 동일한 파일에서 여러 번 안전하게 실행할 수도 있습니다.

운영 체제/BSD

BSD(OSX) sed의 경우 options 인수는 -i선택 사항이 아니라 필수입니다. 따라서 -i.bak확장 프로그램을 사용하여 백업을 만들 .bak거나 -i ''백업을 만들지 않고 파일을 제자리에서 변경하는 데 사용할 수 있습니다.

답변2

find변환할 파일 검색 및 추가 -exec(또는 ) 작업을 사용하여 변환 프로그램을 실행합니다 -execdir. 예를 들어 bd2w현재 디렉터리에서 시작하는 .cpp모든 파일에 대해 실행 하려면 .h다음 명령을 사용합니다.

find . -type f -name "*.cpp" -o -name "*.h" -exec bd2w '{}' \;

나는 위의 논평자가 표현한 우려에 동의한다고 말해야 합니다. 당신의 경험이 당신의 삶을 불필요하게 어렵게 만들지 않습니까? 당신이 유일한 개발자이더라도 코드가 서로 다른 두 컴퓨터에 있다면 로컬에서 git을 설정하는 것이 좋습니다. 이동식 장치에 저장소를 배치하면 소스를 푸시/풀할 수 있습니다. 이렇게 하면 두 컴퓨터 모두에서 소스를 최신 상태로 유지하려고 할 때 오류가 발생하지 않습니다.그리고여러분의 코딩 문제를 해결해 드립니다.

관련 정보