2012-05-17 14 views
8

Làm cách nào để chuyển đổi tất cả EOL (dos-> unix) của tất cả các tệp trong thư mục và thư mục con đệ quy mà không cầndos2unix? (Tôi không có nó và không thể cài đặt nó.)Chuyển đổi tất cả EOL (dos-> unix) của tất cả các tệp trong thư mục và thư mục phụ đệ quy mà không cần dos2unix

Có cách nào để làm điều đó bằng cách sử dụng tr -d '\r' và đường ống? Nếu vậy, làm thế nào?

Trả lời

7

Bạn có thể sử dụng của sed -i cờ để thay đổi các tập tin tại chỗ:

find . -type f -exec sed -i 's/\x0d//g' {} \+ 

Nếu tôi là bạn, tôi sẽ giữ các tập tin xung quanh để đảm bảo các hoạt động đã đi được. Sau đó, bạn có thể xóa các tệp tạm thời khi bạn hoàn tất. Điều này có thể được thực hiện như vậy:

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+ 
find . -type f -name '*.OLD' -delete 
+0

Điều này sẽ xử lý tên tệp chứa khoảng trắng. Sẽ không thêm dòng mới vào cuối mỗi dòng khiến các tệp trở thành khoảng cách đôi - hoặc thậm chí là khoảng cách gấp ba lần (vì bạn đang thay thế dòng trả về bằng dòng mới)? Có, tôi chỉ thử nghiệm nó. –

+0

@DennisWilliamson Tôi chỉ giật mạnh từ một kịch bản tôi có tại văn phòng mà không cần suy nghĩ hai lần. Bây giờ tôi tự hỏi làm thế nào những kịch bản làm việc ở tất cả. (Nó có thể phải làm với thực tế là họ đã có nghĩa là để chuyển đổi các tập tin được tạo ra trong Microsoft Office cho Mac.) Phiên bản mới sẽ hoạt động đúng. –

2

Bạn có tên tệp và tên thư mục sane không có dấu cách, v.v ... không?

Nếu có, nó không quá khó. Nếu bạn phải đối phó với các tên tùy ý chứa các dòng mới và dấu cách, v.v, thì bạn phải làm việc chăm chỉ hơn thế này.

tmp=${TMPDIR:-/tmp}/crlf.$$ 
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15 

find . -type f -print | 
while read name 
do 
    tr -d '\015' < $name > $tmp.1 
    mv $tmp.1 $name 
done 

rm -f $tmp.? 
trap 0 
exit 0 

Công cụ bẫy đảm bảo bạn không lấy các tệp tạm thời. Có các thủ thuật khác mà bạn có thể kéo, với nhiều tên ngẫu nhiên hơn cho các tên tệp tạm thời của bạn. Bạn thường không cần chúng trừ khi bạn làm việc trong một môi trường thù địch.

+0

Lưu ý rằng 'tr' thực sự nhận ra' \ r' (cả hai biến thể BSD và GNU), vì vậy bạn có thể sử dụng 'tr -d '\ r''. –

11

Đối với tất cả các file trong thư mục hiện tại bạn có thể làm điều đó với một Perl one-liner: perl -pi -e 's/\r\n/\n/g' * (bị đánh cắp từ here)

EDIT: Và với một thay đổi nhỏ, bạn có thể làm đệ quy thư mục con:

find | xargs perl -pi -e 's/\r\n/\n/g' 
+2

Nếu 'find' và' xargs' của bạn hỗ trợ nó: 'find -print0 | xargs -0 ... 'sẽ xử lý tên tập tin với khoảng trắng. –

+3

Xem ra nếu bạn sử dụng lệnh này trên kho lưu trữ * Git *. Loại trừ thư mục con '.git' khỏi tìm. – prajmus

1

Bạn cũng có thể sử dụng trình chỉnh sửa ở chế độ hàng loạt.

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \; 
+0

Giải pháp này là giải pháp duy nhất làm việc cho tôi trên Mac OS X. Những người khác bị treo trên nhiều vấn đề khác nhau như 'Không thể chỉnh sửa tại chỗ: .lang không phải là tệp thông thường, <> dòng 22167.' – WilliamKF

0

Nếu \r không được theo sau bởi \n (có lẽ là trường hợp trong các tập tin của Tim Pote):

  • xóa \r (sử dụng tr -d) có thể loại bỏ dòng mới
  • thay thế \r với \n có thể không nguyên nhân các đường kẻ đôi/gấp ba lần

Có lẽ Tim Pote có thể xác minh các điểm trên cho các tệp mà anh đã đề cập.

+0

Điều này nhìn tôi như một lời bình luận tốt về câu trả lời của Tim Pote, nhưng nó không rõ ràng về cách nó thực sự trả lời câu hỏi. –

Các vấn đề liên quan