2009-04-07 5 views
24

누구든지 Windows에서 Powershell 또는 도구를 사용하여 디렉토리를 반복하여 유닉스 파일을 Windows 파일로 변환 할 수 있습니다.Windows newline (Windows)

저는 Powershell에서 적어도 유닉스 파일을 감지하는 방법에 대해 매우 만족합니다.

하나의 파일에 대해이 작업을 쉽게 수행 할 수 있지만 좀 더 확장 성이 뛰어납니다 (따라서 Powershellish 솔루션쪽으로 기울어졌습니다).

+1

http : // superuser.com/questions/27060/batch-convert-files-for-encoding-or-line-ending-under-windows/ –

+0

git repo가 ​​엉망이되어서 이런 일을해야한다고 생각하는 사람들에게는 그렇지 않을 수도 있습니다. git에서 다른 방법으로이 문제를 해결할 수 있습니다. http://stackoverflow.com/questions/1510798/trying-to-fix-line-endings-with-git-filter-branch-but-having-no- luck/1511273 # 1511273 –

답변

28

여기에는 순수한 PowerShell 방법이 있습니다. 끝이어야 하나 개의 UNIX 라인 (PowerShell을 v1을)와

파일 찾기 :

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} } 
다음

찾을 및 Windows 라인 엔딩에 비밀 UNIX 라인 엔딩 방법이다. 한 가지 중요한 점은 끝 부분에 줄이 끝나지 않은 경우 추가 줄 끝 (\ r \ n)이 파일 끝에 추가된다는 것입니다. 정말로 원하지 않는다면 어떻게 피할 수 있는지에 대한 예제를 게시 할 것입니다 (좀 더 복잡합니다).

Get-ChildItem * -Include *.txt | ForEach-Object { 
    ## If contains UNIX line endings, replace with Windows line endings 
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n") 
    { 
     $content = Get-Content $_.FullName 
     $content | Set-Content $_.FullName 
    } 
} 

PowerShell을 자동으로 (존재하는 경우 \ r에 떨어지는) 다음 \ 추가 \ n을에 내용을 분할하기 때문에 위의 작품

연구 \ n은이 파일에 (이 경우에는 선) 각 일을 기록 할 때 . 그래서 항상 파일의 끝에서 끝나는 줄로 끝납니다.

또한 필자는 위 코드를 작성하여 필요한 파일 만 수정합니다. 만약 당신이 그것에 대해 신경 쓰지 않는다면 당신은 if 문을 제거 할 수 있습니다. 아, 파일 만 ForEach-Object에 있는지 확인하십시오. 그 외에는 파이프 라인의 시작 부분에서 원하는 모든 필터링을 수행 할 수 있습니다.

+0

ASCII 파일의 ASCII 인코딩을 유지합니까? ... –

+1

기본적으로 PowerShell은 "유니 코드"로 작동합니다. 텍스트 인코딩에 대한 전문가는 아니지만 기본값에 대한 문제가 아직 발생하지 않았습니다. 원하는 경우 -Encoding 매개 변수를 사용하여 Get-Content 및 Set-Content 명령의 인코딩을 명시 적으로 설정할 수 있습니다. Get-Help Get-Content -Parameter Encoding – JasonMArcher

+0

@PeterSeale Set-Content 또는 Out-File에는 파일 인코딩 형식을 설정하는 데 사용할 수있는 인코딩 매개 변수가 있습니다. –

13

Cygwin에는 dos2unix 및 unix2dos가 있습니다.

+2

유닉스 utils가 원래의 파일 인코딩 (UTF-8, ASCII 등)을 유지 관리하기 때문에이 기술을 권하고 싶습니다. ASCII 파일을 ASCII로 유지하려고 할 때 과거에는 PS에 문제가있었습니다. –

+0

또는 msys를 입력 한 다음 cmd의 유틸리티를 사용할 수 있습니다. – Pod

+2

필자는 powershell을 사용하여 파일을 나열한 다음 dos2unix.exe에 다음과 같이 파이프합니다.'dir -Recurse -File -Exclude .git | 당신이 이미 unix 명령을 사용하고 있다면 % {dos2unix --u2d --skipbin $ _}' – orad

1

Cygwin을 사용하지 않는 경우 Windows 환경에서 Google에서 unix2dos 용 독립 실행 형 실행 파일이 많이 있거나 사용자가 직접 작성할 수 있습니다. 비슷한 (변환 반대 방향) 질문 here을 참조하십시오.

6

다운로드 vim, 여러 파일에 대한 파일 및 문제

:se fileformat=dos|up 

배치 (C에있는 모든 * .txt 인 파일 : \ TMP - 재귀) : 열

:args C:\tmp\**\*.txt 
:argdo se fileformat=dos|up 
+0

폴더 또는 배치 작업으로이 작업을 수행 할 수 있습니까? – ninesided

+0

또는 Eclipse를 다운로드하고 파일을 열고 라인 구분 기호를 Unix로 변환하십시오. vim은 의심의 여지없이 훌륭한 도구이며 매일 사용합니다. 하지만 endofline을 변환하는 데 과도한 부담이 있다고 생각하지 않습니까? –

+3

그것은 내 마음에 온 첫 번째 일이다. 내가 소유하거나 관리하는 모든 상자에있다. Btw : 당신은 실제로 이클립스 (85MB)를 사용하고 vim (8.5MB)을 사용하지 않고 파일 단위로 파일을 한 번에 모두 수행 할 것을 제안합니까? – soulmerge

2

당신은 비주얼 스튜디오를 사용할 수 있습니다 . 파일 -> 고급 저장 옵션 ...

0

워드 패드에 유닉스 라인 결말이있는 파일을 열고 저장하면 모든 라인 결말이 DOS로 다시 쓰여집니다. 많은 수의 파일을 처리하는 데 다소 힘든 일이지만 가끔씩 몇 개의 파일에 대해 충분하게 작동합니다.

1

나는 어제 6 시간을 보냈다. 그리고 오늘은 위의 코드를 반복적으로 10,000 개의 파일로 테스트했다. 그 중 많은 수가 50kb를 초과했다. 결론적으로 PowerShell 코드는 대용량 파일과 많은 수의 파일에 대해 매우 비효율적/느리거나 사용할 수 없습니다. 또한 BOM 바이트를 보존하지 않습니다. 나는 unix2dos 7.2.3이 가장 빠르고 실용적인 해결책이라는 것을 알았습니다. 희망이 다른 사람을 돕고 시간을 절약 할 수 있습니다.

+0

이것은 특히 Get-Content가 대용량 파일에서 매우 느리고 비효율적이라는 사실과 관련이 있습니다. – bluuf

5

이것은 나를 위해 작동하는 것 같습니다.

Get-Content Unix.txt | Out-File Dos.txt 
관련 문제