Chuyển đổi kết thúc dòng Unix sang Windows


37

Gần đây tôi đã chuyển trở lại Windows từ Linux. Tôi có một số tệp có CRLF, một số có tệp LF và một số tệp được trộn lẫn. Có tiện ích nào giúp tôi tìm tất cả các tệp được chạm vào Unix và chuyển đổi chúng thành các tệp đã kết thúc CRLF không?

Tiện ích phải chạy trên Windows, không phải Linux. Tôi đã di chuyển rồi. Tôi không muốn cài đặt Cygwin nếu tôi có thể tránh nó.


1
có liên quan: xem superuser.com/questions/38744 superuser.com/questions/27060 superuser.com/questions/52044 ... bất kỳ công cụ nào được đề cập trong đó đều có thể được đảo ngược để thực hiện những gì bạn muốn làm
quack quixote

Câu hỏi trùng lặp
ukanth

Các giải pháp trong những câu hỏi được gọi là trùng lặp này đều chạy trên nền tảng linux hoặc tạo thành chuyển đổi ngược lại. Tôi không có linux nữa. Tôi có cửa sổ
Matthew Scouten

1
tất cả chúng đều có sẵn cho Windows thông qua Cygwin, GnuWin32, UnxUtils hoặc tương tự. Tôi tin rằng có những kịch bản Powershell cũng có thể làm điều này, mặc dù tôi không biết đủ về nó để cung cấp bất kỳ liên kết nào.
quack quixote

1
@quack: Câu hỏi đặc biệt nêu rõ rằng người dùng đang tìm kiếm thứ gì đó sẽ thực hiện công việc trên Windows, sử dụng tiện ích Windows.
Brian Lacy

Câu trả lời:


33

Bạn có thể chuyển đổi chúng với unix2dostiện ích trên nền tảng Linux của bạn. Có unix2dos các phiên bản có sẵn cho Windows .

Nếu bạn đã cài đặt Perl, bạn cũng có thể sử dụng một lớp lót này:

perl -p -e 's/\n/\r\n/' < UNIX_LF.txt > WINDOWS_CRLF.txt

Tôi đã làm một cái gì đó tương tự như thế này, nhưng tôi đã sử dụng python.
Matthew Scouten

2
@Matthew Scouten: vì vậy ... bạn đã tìm thấy một tiện ích unix chạy trên windows! chúc mừng!
quack quixote

8
có và không. Tôi VIẾT tiện ích nổ tung của riêng tôi. Tôi có thể đã làm điều này từ đầu, nhưng tôi đã hy vọng tiết kiệm được 30 phút. Thật không may, tôi không hài lòng với bất kỳ tiện ích có sẵn. Gần nhất tôi tìm thấy hỏng bất kỳ tập tin nhị phân trong thư mục.
Matthew Scouten

Có vấn đề khi chuyển đổi với dos2unix và unix2dos - nếu tệp có hỗn hợp CRLF và LF, có thể có một số sự cố sẽ không được thay thế.
thích

17

Đây là một cách dễ dàng và nhanh chóng.

Kéo và thả tệp văn bản vào Chrome (Tôi không biết về các trình duyệt khác) rồi cắt và dán lại vào tệp gốc :)


2
hehe Câu trả lời này khiến tôi lol
ClintM

tất cả các trình duyệt có thể đọc kết thúc dòng Unix tốt, bao gồm cả IE. Nhưng ngay cả wordpad cũng có thể làm điều đó, và Notepad hiện đại cũng vậy . Điều quan trọng ở đây là làm thế nào để tự động chuyển đổi nhiều tệp
phuclv

10

Công cụ tôi tìm thấy tốt nhất để đệ quy qua các thư mục, cho phép các bộ lọc tệp và cho phép tìm kiếm đơn giản cho "\ r \ n" và thay thế nó bằng "\ n" là Notepad ++ .

Notepad ++ là một trong những chương trình notepad mã nguồn mở, miễn phí tốt nhất dành cho Windows. Nó rất đơn giản và mạnh mẽ. Nó xử lý dòng kết thúc tìm kiếm / thay thế tốt. Nhà thầu kiểm tra một loạt các tệp .c và .h vào kho lưu trữ của chúng tôi bằng các kết thúc dòng Linux \ r \ n, nhưng vì hầu hết mọi người đã chuẩn hóa các công cụ xây dựng Windows / Eclipse, các tệp sẽ không được xây dựng cho đến khi các kết thúc dòng được chuyển đổi .


8
Tôi nghĩ bạn đã đảo ngược các kết thúc ở đó: linux là \ n, windows là \ r \ n
Matthew Scouten

10
Notepad ++ cũng có một Edit -> EOL Conversionmenu đơn giản nếu số lượng tệp cần chuyển đổi là nhỏ.
dùng1071136

8

Sử dụng dao tập tin Thụy Sĩ .

Ví dụ: sfk addcr -dir . -file .txt -norec
thay đổi kết thúc LF thành CR / LF cho Windows, trên tất cả các tệp .txt của thư mục hiện tại, nhưng KHÔNG trong thư mục con (không có đệ quy).

Nhưng chương trình này làm được nhiều hơn thế.


Tôi không chỉ định -norecvì tôi muốn đệ quy xảy ra nhưng có vẻ như không phải vậy
Csaba Toth

6

Trên Cygwin, bạn có thể chuyển đổi giữa các tệp Windows Unix và AKA "DOS" bằng hai tiện ích tích hợp:

Chuyển đổi sang định dạng DOS CR / LF:

u2d filename

Chuyển đổi về định dạng Unix CR:

d2u filename

Các tập tin được để lại ở vị trí có cùng tên.

Thưởng thức! Rick


Điều này đôi khi được gọi dos2unixhoặc unix2dostrong trường hợp bạn không thể tìm thấy nó là u2d hoặc d2u. Ngoài ra còn cóunix2mac
gtatr

3

Tôi sẽ ném giải pháp này ra khỏi đó. Git sẽ làm điều này. Xem bài này về nó

Vì vậy, về mặt lý thuyết bạn có thể làm điều này để chuyển đổi toàn bộ cây

cd root/of/tree
git init .
git add .
git commit -m "initial commit"
echo "* text eol=crlf" > .gitattributes
git rm --cached -r .
git reset --hard

Thay đổi crlfthành lfnếu bạn muốn đi theo con đường khác. LƯU Ý: bạn chưa hoàn thành, hãy tiếp tục đọc

Nhập git statusđể xem tập tin nào sẽ bị ảnh hưởng. Bạn có thể phải thêm các dòng như

*.jpg binary
*.png binary
*.gif binary

vv để .gitattributestránh chuyển đổi các tập tin nhất định. Bạn cũng có thể đánh dấu rõ ràng một số tệp nhất định dưới dạng văn bản

*.md text
*.css text

Sau đó, chỉ cần lặp lại 2 dòng này sau khi bạn chỉnh sửa .gitattributes

git rm --cached -r .
git reset --hard

Sau đó sử dụng git statuslại để xem tập tin nào sẽ được thay đổi. Khi bạn chắc chắn tất cả các tệp bạn muốn bị ảnh hưởng sẽ được liệt kê git statussau đó cam kết

git add .
git commit -m "normalize line endings"

Bây giờ hãy kiểm tra lại tất cả các tập tin

git rm --cached -r .
git reset --hard

Bây giờ họ sẽ có bất cứ kết thúc dòng mong muốn của bạn là gì

** LƯU Ý: Nếu bạn đã sử dụng git, hãy bỏ qua 3 lệnh git đầu tiên. Nếu bạn không sử dụng git, bây giờ bạn có thể xóa .gitattributestệp và .gitthư mục.

** Sao lưu các tệp của bạn: git rm --cached -rxóa tất cả chúng (mặc dù về mặt lý thuyết là trong repit git của bạn (thư mục .git), đó là cách chúng được khôi phục bằng lệnh cuối cùng git reset --hard. Chỉ vì các tệp đang bị xóa, có lẽ tốt nhất là sao lưu chúng lên.


1

Bản phân phối Linux của tôi có hai tiện ích nhỏ gọi là fromdostodos mà tôi sử dụng cho tác vụ này.


OP đang yêu cầu một công cụ Windows
phuclv

1

Sử dụng trình soạn thảo văn bản hiểu cả hai kết thúc dòng như SciTE hoặc Notepad ++ nếu bạn không cần phải chuyển đổi tất cả các dòng kết thúc trong tất cả các tệp của mình, nhưng chỉ không muốn thấy toàn bộ tệp được bó lại trên dòng đầu tiên.


Đó là những gì họ nói khi tôi gặp vấn đề nghịch đảo khi chuyển sang linux. Tôi tiếp tục chạy vào các công cụ có vấn đề với kết thúc dòng sai. Và KHÔNG NÊN xử lý kết thúc dòng hỗn hợp hợp lý.
Matthew Scouten

@Matthew Tôi biết chính xác các kết thúc dòng unix / windows . Tôi sử dụng nó cho mục đích đó trong windows vms tôi chạy trong linux khi chỉnh sửa tập tin trên hệ thống máy chủ.
nelaaro

Tôi chắc chắn rằng các biên tập viên mà bạn đề nghị sẽ hoạt động tốt. nhưng tại một số điểm, tôi sẽ cần cung cấp tệp văn bản cho một số công cụ khác và công cụ đó sẽ KHÔNG. Tại thời điểm đó, có một trình soạn thảo văn bản xử lý mọi việc tốt sẽ làm cho nó tồi tệ hơn bằng cách che giấu vấn đề. và tôi sẽ cá rằng nó vẫn xử lý các kết thúc hỗn hợp tồi tệ (hoặc ít nhất là với các quirks).
Matthew Scouten

1
+1 cho tùy chọn notepad ++ để chuyển đổi kết thúc nói dối. Và đây là cách thực hiện cụ thể hơn (xem phần "Phương pháp 2"): staffwww.fullcoll.edu/brippe/csci123/saveAsUnix.aspx
WIP

Notepad ++ đã có các giải pháp để chuyển đổi kết thúc dòng, mã hóa trong số những thứ khác
phuclv

0

Có nhiều cách để dịch các ký tự eoln trong các tệp văn bản và mọi người đều yêu thích.

Nhưng tôi luôn chuyển các tệp từ Linux sang Windows ở chế độ BINary, sau đó tôi mở các tệp văn bản trong Windows bằng trình chỉnh sửa có khả năng mở cả hai loại và lưu chúng ở bất kỳ dạng nào, nếu cần.

Tôi đã sử dụng Trình lập trình tệp Trình chỉnh sửa cho việc này, nhưng Notepad ++ cũng có thể làm điều đó. Wordman cũng hữu ích [ít nhất, để xem các tập tin đã kết thúc của LF].

Tôi đang nghĩ về các tệp văn bản đơn giản có thể có nguồn gốc từ Linux và cần có thể đọc được trong thế giới (tiêu chuẩn defacto) của Windows. Tôi không chắc ý của bạn là 'tập tin không chạm'.


Vấn đề với phương pháp này là nó chỉ thực hiện một tệp tại một thời điểm.
Matthew Scouten

'các tệp không được chạm' là từ của tôi cho cả các tệp CRLF-LF hỗn hợp. Khi một tệp đã được chỉnh sửa trong các công cụ unix-oid, nó có xu hướng bị 'lây nhiễm' với các dòng chỉ có LF.
Matthew Scouten

2
Điều tôi thực sự đã nói là bằng cách chọn phần mềm phù hợp để xem tệp văn bản, chúng hoàn toàn không phải chuyển đổi. BTW, tôi tránh đưa bạn đến nhiệm vụ mô tả các tệp kết thúc CRLF là 'phù hợp'. Nó phụ thuộc hoàn toàn vào quan điểm của bạn. Mỗi phương pháp là phù hợp trong hệ điều hành riêng của mình. Khi một tệp được chuyển đến một HĐH khác, thì chúng ta thấy rằng Win / Mac / Linux đều khác nhau. Tôi nghi ngờ rằng phương thức Unix / Linux là phương thức ban đầu.
pavium

3
Bạn nghi ngờ sai. Tiêu chuẩn ASCII ban đầu được phát triển cho các máy teletype và CRLF bắt buộc. Hầu hết các giao thức internet (bao gồm HTTP, SMTP, FTP, IRC và nhiều giao thức khác) cũng yêu cầu các kết thúc CRLF (hầu hết các triển khai đều chấp nhận LF để tương thích với các chương trình Unix không tuân thủ). Trong trường hợp này, Windows đang tuân theo tiêu chuẩn và Unix và Mac đang phá vỡ nó.
Matthew Scouten

0

Để cung cấp nhiều tùy chọn hơn (mặc dù tôi rất thích câu trả lời hack của người dùng45832 ):

Chuyển đổi trực tuyến

Tôi đoán một chương trình GUI FTP sẽ tự động làm điều đó

Batch / DOS one-liner (loại bỏ các dòng trống) :

FOR /F "eol= delims= usebackq" %a IN (infile.txt) DO (ECHO %a>> outfile.txt)

Quyền hạn:

gc infile.txt | %{$_.split("`n")} | Out-File outfile.txt

Có hai người cuối cùng từ đây


0

Nhận AWK cho Windows .

Chuyển đổi kết thúc dòng Unix sang kết thúc dòng Windows:

awk 'sub("$", "\r")' unixfile.txt > winfile.txt

Chuyển đổi kết thúc dòng Windows thành kết thúc dòng Unix:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

Các phiên bản cũ hơn awkkhông bao gồm subchức năng. Trong các trường hợp như vậy, sử dụng cùng một lệnh, nhưng thay thế awkbằng gawkhoặc nawk.

Nguồn


0

Trên Wikipedia có một giải pháp trong cmd:

TYPE unix_file | FIND /V "" > dos_file

Trong PowerShell, có nhiều cách khác nhau để làm điều đó bằng cách đảo ngược những gì đã được thực hiện trong câu hỏi này .

(Get-Content $file -Raw).Replace("`n", "`r`n") | Set-Content $path -Force

(Get-Content $infile) -join "`r`n" > $outfile

$text = [IO.File]::ReadAllText($original_file) -replace "`n", "`r`n"
[IO.File]::WriteAllText($original_file, $text)

Bạn cũng có thể thực hiện điều này trong VBScriptJScript , đây cũng là các công cụ đã có sẵn trong Windows mà không cần cài đặt ứng dụng của bên thứ ba.


-2

Tôi đã từng mở tệp trong 'chỉnh sửa' và lưu lại khi công việc đã hoàn thành ...


"chỉnh sửa" là gì? không có công cụ nào như vậy trong windows 10
phuclv


rõ ràng tôi đã sử dụng edittrong DOS nhưng câu hỏi này là về Windows
phuclv

1
editđã từng là một phần của Windows Windows XP. Câu trả lời của tôi là khoảng 8 tuổi. Vào thời điểm đó editlà một phần của cài đặt Windows trong nhiều trường hợp ...
Radek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.