2009-04-07 48 views
24

Có ai biết một cách (nói Powershell, hoặc một công cụ) trong Windows có thể recurse qua một thư mục và chuyển đổi bất kỳ tập tin unix vào cửa sổ tập tin.Dòng mới Unix vào cửa sổ dòng mới (trên Windows)

Tôi hoàn toàn hài lòng với cách thức để Powershell phát hiện tệp unix.

Thật dễ dàng làm điều này cho một tệp duy nhất, nhưng tôi sau khi một cái gì đó một chút khả năng mở rộng hơn (do đó nghiêng về phía một giải pháp Powershellish).

+1

http: // superuser.com/questions/27060/batch-convert-files-for-encoding-hoặc-line-end-under-windows/ –

+0

Đối với những người nghĩ rằng họ cần phải làm điều này vì một repo git hơi say, bạn có thể không. Có thể khắc phục sự cố này với git theo các cách khác, như: http://stackoverflow.com/questions/1510798/trying-to-fix-line-endings-with-git-filter-branch-but-having-no- may mắn/1511273 # 1511273 –

Trả lời

28

Đây là cách PowerShell tinh khiết nếu bạn quan tâm.

Tìm file với ít nhất một dòng UNIX kết thúc (PowerShell v1):

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

Đây là cách bạn tìm và bí mật UNIX kết thúc dòng để kết thúc dòng Windows. Một điều quan trọng cần lưu ý là một dòng kết thúc (\ r \ n) sẽ được thêm vào cuối tệp nếu chưa có dòng nào kết thúc ở cuối. Nếu bạn thực sự không muốn điều đó, tôi sẽ đăng một ví dụ về cách bạn có thể tránh nó (nó phức tạp hơn một chút).

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 
    } 
} 

Các công trình trên vì PowerShell sẽ tự động tách các nội dung trên \ n (thả \ r nếu chúng tồn tại) và sau đó thêm \ r \ n khi nó viết mỗi điều (trong trường hợp này một dòng) đến tập tin . Đó là lý do tại sao bạn luôn kết thúc bằng một dòng kết thúc ở cuối tệp.

Ngoài ra, tôi đã viết mã ở trên để nó chỉ sửa đổi các tệp cần thiết. Nếu bạn không quan tâm đến điều đó, bạn có thể loại bỏ câu lệnh if. Oh, hãy chắc chắn rằng chỉ có các tập tin có được đối tượng ForEach. Ngoài ra, bạn có thể thực hiện bất kỳ bộ lọc nào bạn muốn khi bắt đầu kênh đó.

+0

Điều này có duy trì mã hóa ASCII cho các tệp ASCII không? ... –

+1

Theo mặc định PowerShell hoạt động trong "Unicode". Tôi không có chuyên gia về mã hóa văn bản, nhưng tôi chưa gặp sự cố với các giá trị mặc định. Nếu muốn, bạn có thể đặt mã hóa rõ ràng cho các lệnh Get-Content và Set-Content với tham số -Encoding. Get-Help Get-Content -Parameter Encoding – JasonMArcher

+0

@PeterSeale Set-Content hoặc Out-File có tham số -Encoding có thể được sử dụng để đặt loại mã hóa tệp. –

13

Có dos2unix và unix2dos trong Cygwin.

+2

Tôi muốn giới thiệu kỹ thuật này vì các utix unix sẽ thực hiện công việc tốt hơn để duy trì mã hóa tệp gốc (UTF-8, ASCII, v.v.). Tôi đã có vấn đề với PS trong quá khứ khi tôi dự định giữ ASCII tập tin ASCII. –

+0

hoặc msys và sau đó bạn có thể sử dụng các tiện ích từ cmd. – Pod

+2

Tôi sử dụng PowerShell để liệt kê các tệp và sau đó đặt nó vào dos2unix.exe như sau: 'dir -Recurse -File -Exclude .git | % {dos2unix --u2d --skipbin $ _} ' – orad

1

Nếu Cygwin không dành cho bạn, có rất nhiều tệp thực thi độc lập cho unix2dos trong Windows nếu bạn sử dụng Google, hoặc bạn có thể tự viết, xem câu hỏi tương tự (hướng đối với chuyển đổi) here.

6

tải vim, mở tập tin của bạn và vấn đề

:se fileformat=dos|up 

hàng loạt cho nhiều file (tất cả các tập tin * .txt trong C: \ tmp - recursive):

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

bạn có thể làm điều này cho một thư mục hoặc như một công việc hàng loạt? – ninesided

+0

Hoặc tải xuống Eclipse, mở tệp và chuyển đổi các dấu phân cách dòng thành Unix. vim là không có nghi ngờ một công cụ tuyệt vời và tôi sử dụng nó mỗi ngày. Nhưng bạn không nghĩ rằng nó là một chút quá mức cần thiết để sử dụng để chuyển đổi endofline? –

+3

Nó chỉ là thứ đầu tiên xuất hiện trong tâm trí tôi, nó nằm trên mỗi chiếc hộp mà tôi sở hữu/quản lý. Btw: bạn có thực sự đề nghị sử dụng eclipse (85MB) và làm nó theo từng tập tin thay vì sử dụng vim (8.5MB) và làm tất cả cùng một lúc? – soulmerge

2

Bạn có thể sử dụng Visual Studio . Tệp -> Tùy chọn Lưu Nâng cao ...

0

Mở tệp có đuôi dòng Unix trong Wordpad và lưu tệp sẽ ghi lại tất cả các đuôi kết thúc dưới dạng DOS. Một chút mất thời gian cho số lượng lớn các tệp, nhưng nó hoạt động đủ tốt cho một vài tệp một lần trong một thời gian.

1

Tôi đã dành 6 giờ ngày hôm qua và hôm nay kiểm tra mã được đưa ra ở trên trong vòng lặp với 10.000 tệp, nhiều tệp trong số đó có kích thước là 50kb. Tóm lại, mã powerhell là rất không hiệu quả/chậm/không sử dụng được cho các tệp lớn và số lượng tệp lớn. Nó cũng không bảo tồn byte BOM. Tôi thấy unix2dos 7.2.3 là giải pháp nhanh nhất và thiết thực nhất. Hy vọng điều này sẽ giúp người khác và tiết kiệm thời gian.

+0

Điều này phải làm với thực tế là Get-Content rất chậm (và không hiệu quả), đặc biệt là trên các tệp lớn hơn. – bluuf

5

Điều này có vẻ phù hợp với tôi.

Get-Content Unix.txt | Out-File Dos.txt