2011-01-18 36 views
11

Tôi muốn tìm hiểu tệp nào trong thư mục của tôi là tệp văn bản dos (ngược với tệp văn bản unix).Cách tìm tệp định dạng dos trong hệ thống tệp linux

Những gì tôi đã cố gắng:

find . -name "*.php" | xargs grep ^M -l 

Nó không đem lại cho tôi kết quả đáng tin cậy ... vì vậy tôi đang tìm kiếm một sự thay thế tốt hơn.

Bất kỳ đề xuất, ý tưởng nào?

Cảm ơn

Làm rõ

Ngoài những gì tôi đã nói ở trên, vấn đề là tôi có một loạt các dos file không có^ký tự M trong họ (do đó lưu ý tôi về độ tin cậy).

The way i hiện xác định xem một tập tin là dos hay không là thông qua Vim, nơi ở phía dưới nó nói:

"filename.php" [dos] [noeol] 
+0

... Làm thế nào chính xác là nó không đáng tin cậy? –

+0

@ignacio Điều gì b vbp nói. Nghĩa là, tôi muốn có thể tìm thấy thuộc tính của tệp chứ không phải tệp có chứa – denormalizer

+2

Nhưng đó không phải là thuộc tính của tệp, đó là tệp chứa. –

Trả lời

9

Không chắc chắn những gì bạn có nghĩa là chính xác bởi "không đáng tin cậy", nhưng bạn có thể muốn thử:

find . -name '*.php' -print0 | xargs -0 grep -l '^M$' 

này sử dụng hơn tàn bạo-tên tập tin-với-gian-trong-chúng-thân thiện lựa chọn và chỉ tìm thấy kí tự xuống dòng ngay trước khi kết thúc dòng.

Hãy ghi nhớ rằng ^M là một đơn CTRLM nhân vật, không hai ký tự.

Và cũng sẽ liệt kê các tệp ngay cả một dòng ở chế độ DOS, có thể là những gì bạn muốn, vì những tệp đó sẽ là tệp UNIX bị trình chỉnh sửa không phải UNIX tạo ra.


Dựa trên bản cập nhật của bạn mà Vim được báo cáo tập tin của bạn như là định dạng DOS:

Nếu vim báo cáo nó như là định dạng hệ điều hành DOS, sau đó mỗi dòng kết thúc với CRLF. Đó là cách vim hoạt động. Nếu ngay cả một dòng không có CR, thì nó được coi là định dạng UNIX và các ký tự ^M hiển thị trong bộ đệm. Nếu đó là tất cả định dạng DOS, các ký tự ^M không được hiển thị:

Vim sẽ tìm cả hai đuôi và dòng unix, nhưng Vim có tùy chọn tích hợp cho định dạng unix.

- Nếu tất cả các dòng trong tệp kết thúc bằng CRLF, định dạng tệp dos sẽ được áp dụng, nghĩa là mỗi CRLF bị xóa khi đọc dòng vào bộ đệm và tùy chọn bộ đệm 'ff' sẽ là dos.
- Nếu một hoặc nhiều dòng kết thúc bằng LF, định dạng tệp unix sẽ được áp dụng, nghĩa là mỗi LF được loại bỏ (nhưng mỗi CR sẽ có mặt trong bộ đệm và sẽ hiển thị là^M) và bộ đệm ' ff 'tùy chọn sẽ được unix.

Nếu bạn thực sự muốn biết những gì trong tập tin, không dựa trên một công cụ quá thông minh như vim :-)

Sử dụng:

od -xcb input_file_name | less 

và kiểm tra dòng kết thúc chính mình.

+1

Cảm ơn bạn đã trả lời,^M và^M $ dường như không trả lại bất kỳ kết quả nào nhiều hơn hoặc ít hơn cho tôi – denormalizer

12

Làm thế nào về:

find . -name "*.php" | xargs file | grep "CRLF" 

Tôi không nghĩ rằng đó là đáng tin cậy để thử và sử dụng ^M để thử và tìm các tập tin.

+1

Điều này giống như những gì tôi nghĩ đến (nghĩa là tìm thuộc tính của tệp chứ không phải nội dung của tệp). Thật không may, một loạt các tập tin dos php trở lại như là "văn bản kịch bản PHP" khi thông qua các * tập tin * lệnh thay vì một cái gì đó về CRLF – denormalizer

+1

cho tôi câu trả lời này làm việc trong khi câu trả lời chấp nhận đã không làm việc! – mrsteve

0

Điều này giống như giải pháp ban đầu của bạn; do đó, nó có thể dễ dàng hơn cho bạn để nhớ: Quá trình

find . -name "*.php" | xargs grep "\r" -l 

tưởng:

Trong VIM, để loại bỏ các^M bạn gõ:

%s:/^M//g 

đâu^là Ctrl của bạn phím và M là phím ENTER. Nhưng tôi không bao giờ có thể nhớ các phím gõ để in chuỗi đó, vì vậy tôi đã luôn luôn loại bỏ chúng bằng cách sử:

%s:/\r//g 

Vì vậy, khấu trừ của tôi là \ r và^M là tương đương với các cựu là dễ dàng hơn để hãy nhớ nhập.

+0

Cảm ơn phản hồi của bạn, nhưng tiếc là không thêm bất cứ điều gì vào những gì tôi đã có ... Tôi sử dụng phương pháp tương tự để loại bỏ^M nếu tôi đang ở vim và sử dụng fromdos khi tôi ở bên ngoài – denormalizer

0

GNU tìm

find . -type f -iname "*.php" -exec file "{}" + | grep CRLF 

Tôi không biết những gì bạn muốn làm sau khi bạn tìm những file php DOS, nhưng nếu bạn muốn chuyển đổi chúng sang định dạng unix, sau đó

find . -type f -iname "*.php" -exec dos2unix "{}" +; 

sẽ đủ. Không cần phải kiểm tra cụ thể xem chúng có phải là các tệp DOS hay không.

+0

đây là một phương pháp tương tự để @pvpb ... nhưng nó vẫn còn thiếu ... không trả lại kết quả tôi mong đợi (bởi vì tất cả các tệp PHP báo cáo rằng chúng là "tập lệnh PHP") – denormalizer

1

tôi có may mắn với

find . -name "*.php" -exec grep -Pl "\r" {} \; 
+0

Điều này ít nhiều giống như câu trả lời được chấp nhận, ngoại trừ nó sử dụng exec thay vì xargs. Tôi tìm thấy xargs được nhanh hơn đáng kể, trong trường hợp này ít nhất. – denormalizer

0

Nếu bạn thích vim để cho bạn biết các file có định dạng này, bạn có thể sử dụng đoạn mã sau:

"use this script to check which files are in dos format according to vim 
"use: in the folder that you want to check 
"create a file, say res.txt 
"> vim -u NONE --noplugins res.txt 
"> in vim: source this_script.vim 

python << EOF 
import os 
import vim 

cur_buf = vim.current.buffer 

IGNORE_START = ''.split() 
IGNORE_END = '.pyc .swp .png ~'.split() 

IGNORE_DIRS = '.hg .git dd_ .bzr'.split() 

for dirpath, dirnames, fnames in os.walk(os.curdir): 
    for dirn in dirnames: 
    for diri in IGNORE_DIRS: 
     if dirn.endswith(diri): 
     dirnames.remove(dirn) 
     break 
    for fname in fnames: 
    skip = False 
    for fstart in IGNORE_START: 
     if fname.startswith(fstart): 
     skip = True 
    for fend in IGNORE_END: 
     if fname.endswith(fend): 
     skip = True 
    if skip is True: 
     continue 
    fname = os.path.join(dirpath, fname) 
    vim.command('view {}'.format(fname)) 
    curr_ff = vim.eval('&ff') 
    if vim.current.buffer != cur_buf: 
     vim.command('bw!') 
    if curr_ff == 'dos': 
     cur_buf.append('{} {}'.format(curr_ff, fname)) 
EOF 

vim của bạn cần phải được biên dịch với python (python được sử dụng để lặp qua các tập tin trong thư mục, có lẽ là một cách dễ dàng hơn để làm điều này, nhưng tôi không thực sự biết nó ....

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