2008-09-23 50 views
46

Tôi có một bó (hàng trăm) tệp được cho là có kết thúc dòng Unix. Tôi mạnh mẽ nghi ngờ rằng một số người trong số họ có kết thúc dòng Windows, và tôi muốn lập trình con số mà những người làm.Cách xác định dòng kết thúc của một tệp

Tôi biết tôi chỉ có thể chạy

flip -u
hoặc nội dung nào đó tương tự trong tập lệnh để chuyển đổi mọi thứ, nhưng tôi muốn có thể xác định những tệp cần thay đổi trước.

Trả lời

28

Bạn có thể sử dụng grep

egrep -l $'\r'\$ * 
+0

Chỉ cần lưu ý: lệnh trên yêu cầu phải chạy từ bash. – tzot

+3

vì một số lý do, khi tôi chạy lệnh này trong một hệ vỏ MacOS X, tôi nhận được một danh sách tất cả các tệp trong thư mục. Ngay cả cái mà tôi mới tạo ra với phép thử "echo" "> torderform6.cpp". Bất kỳ ý tưởng những gì có thể sẽ sai? –

+7

Nó chỉ liệt kê tất cả các tệp trong thư mục cho tôi trên Ubuntu. – rjmunro

0

Windows sử dụng char 13 & 10 cho dòng kết thúc, chỉ unix một trong số chúng (tôi không nhớ cái nào). Vì vậy, bạn có thể thay thế char 13 & 10 cho char 13 hoặc 10 (cái có sử dụng unix).

64

Bạn có thể sử dụng công cụ file, công cụ này sẽ cho bạn biết loại kết thúc dòng. Hoặc, bạn chỉ có thể sử dụng dos2unix -U sẽ chuyển đổi mọi thứ thành các kết thúc dòng Unix, bất kể nó bắt đầu bằng cái gì.

+4

tệp không hiển thị kết thúc dòng. Ví dụ : "file .bashrc => .bashrc: Văn bản tiếng Anh ASCII" Cần một số phím bổ sung? –

+7

@Fedir: Có, nó chỉ, nó chỉ là nếu tập tin có kết thúc dòng LF thường xuyên, sau đó nó sẽ không in bất kỳ đầu ra.Nhưng nếu tập tin có CRLF, CR trần hoặc kết thúc dòng hỗn hợp, nó sẽ cho bạn biết điều đó. –

+2

Đã không làm việc cho tôi trên một kịch bản Perl CRLF chỉ trên OS X. Có thể là một phần mở rộng GNU? –

3

Unix sử dụng một byte, 0x0A (LineFeed), trong khi cửa sổ sử dụng hai byte, 0x0D 0x0A (Tốc độ truyền tải dòng, Nguồn cấp dữ liệu dòng).

Nếu bạn chưa bao giờ thấy 0x0D thì rất có khả năng là Unix. Nếu bạn thấy các cặp 0x0D 0x0A thì rất có thể MSDOS.

14

cái gì đó dọc theo dòng:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME 

mặc dù một số regexp rằng có thể cần phải lọc và quét dọn.

Điều đó sẽ xuất tệp của bạn bằng WIN, MAC hoặc UNIX ở cuối mỗi dòng. Tốt nếu tập tin của bạn bằng cách nào đó là một mớ hỗn độn khủng khiếp (hoặc một khác) và có kết thúc hỗn hợp.

+0

Làm việc cho tôi trên Ubuntu, câu trả lời được chấp nhận dường như chỉ liệt kê tất cả các tệp –

+0

Không hoạt động cho tôi, cung cấp: 'Chưa từng có) trong regex; được đánh dấu bởi <- HERE bằng m/(? <! WIN) <- HERE \ n/tại -e dòng 1.' – moshen

+0

bạn cần thay thế < bằng '<' – Joseph

0

Khi bạn biết tệp nào có đuôi dòng Windows (0x0D 0x0A hoặc \r \n), bạn sẽ làm gì với tệp đó? Tôi giả sử, bạn sẽ chuyển đổi chúng thành các đầu dòng Unix (0x0A hoặc \n). Bạn có thể chuyển đổi tập tin với kết thúc dòng Windows vào kết thúc dòng Unix với sed tiện ích, chỉ cần sử dụng lệnh:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt 

Bạn có thể đặt nó vào kịch bản như thế này:

#!/bin/bash 

function travers() 
{ 
    for file in $(ls); do 
     if [ -f "${file}" ]; then 
      sed -i 's/\r//' "${file}" 
     elif [ -d "${file}" ]; then 
      cd "${file}" 
      travers 
      cd .. 
     fi 
    done 
} 

travers 

Nếu bạn chạy nó từ gốc của bạn dir với các tập tin, ở cuối bạn sẽ chắc chắn tất cả các tập tin được với kết thúc dòng Unix.

4

Đây là câu trả lời không an toàn nhất. Stimms trả lời tài khoản doesn cho các thư mục con và các tập tin nhị phân

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }' 
  • Sử dụng file để tìm loại tập tin. Những người có CRLF có cửa sổ trả về ký tự. Đầu ra của file được giới hạn bởi : và trường đầu tiên là đường dẫn của tệp.
+0

Thực sự là cách không an toàn nhất. Để chuyển đổi chỉ tất cả các tập tin tìm thấy chỉ cần chạy 'tìm. -tập tin f -exec {} \; | grep "CRLF" | awk -F ':' '{print $ 1}' | xargs flip -ub' sau đó. – pixelbrackets

+2

Hầu hết không an toàn nó không phải là - 'tập tin' không phải luôn luôn nói" CRLF "trong đầu ra của nó, mà phụ thuộc vào loại tập tin đó. Tôi đã phát hiện ra rằng đối với các tệp SVG - chứa văn bản giống như các tệp văn bản thuần túy - 'tệp' không đề cập đến loại kết thúc dòng được sử dụng. Kịch bản này do đó không phải là loại tệp bất khả tri. Chỉ cần nói. Nếu không thì trông giống như một lớp lót sane, giới hạn nói trên không chịu được. – amn

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