2011-01-18 1 views
11

Я хотел бы узнать, какие из моих файлов в каталоге являются текстовыми текстовыми файлами (в отличие от текстовых файлов unix).Как найти файлы формата dos в файловой системе linux

Что я пробовал:

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

Это не дает мне надежные результаты ... так что я в поисках лучшей альтернативы.

Любые предложения, идеи?

Благодаря

Разъяснение

В дополнение к тому, что я уже говорил выше, проблема заключается в том, что у меня есть куча файлов с дос нет^M символов в них (следовательно мое примечание о надежности).

Путь я в настоящее время определить, является ли файл дос или нет, через Vim, где в нижней части говорится:

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

... Как точно это не так? –

+0

@ignacio Что b говорит vbp. То есть, я хочу, чтобы найти свойство файла, а не то, что файл содержит – denormalizer

+2

Но это не свойство файла, это то, что содержит файл. –

ответ

9

Не уверен, что вы имеете в виду именно по «не надежен», но вы можете попробуйте:

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

Это использует больше зверских-имен файлов-с-пространства-в-них чистые вариантов и находит только возврат каретки непосредственно перед концом строки.

Имейте в виду, что ^M является одной CTRLM характер, не два символов.

А также, что он будет перечислять файлы, в которых даже одна строка находится в режиме DOS, что, вероятно, так или иначе, так как это были бы файлы UNIX, искаженные редактором, отличным от UNIX.


На основе вашего обновления, VIM это отчетов файлы как формат DOS:

Если ВИМ является отчетности как формат DOS, затем каждый линия заканчивается CRLF. Вот как работает vim. Если даже одна строка не имеет CR, то это считается UNIX-форматом, а символы ^M видны в буфере. Если все это формат DOS, не отображается ^M символов:

Vim будет искать как дос и окончание строк Unix, но Vim имеет встроенное в предпочтение формата Unix.

- Если все строки в файле заканчиваются CRLF, будет применяться формат файла dos, что означает, что каждый CRLF удаляется при чтении строк в буфер, а опция buffer ff - dos.
- Если одна или несколько строк заканчиваются только LF, будет применен формат файла unix, что означает, что каждый LF будет удален (но каждый CR будет присутствовать в буфере и будет отображаться как^M), а буфер " ff 'будет unix.

Если вы действительно хотите знать, что в файле, не полагаться на слишком умный инструмент, как Vim :-)

Использование:

od -xcb input_file_name | less 

и проверить линия заканчивается самостоятельно.

+1

Спасибо за ваш отзыв,^M и^M $, похоже, не вернут мне больше или меньше результатов – denormalizer

12

Как насчет:

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

Я не думаю, что это надежно, чтобы попытаться использовать ^M, чтобы попытаться найти файлы.

+1

Это больше похоже на то, что я имел в виду (то есть найти свойство файла, а не контент файла). К сожалению, целая куча dos php-файлов была возвращена как «текст скрипта PHP» при передаче через команду * file * вместо чего-то о CRLF – denormalizer

+1

для меня этот ответ работал, пока принятый ответ не сработал! – mrsteve

0

Это очень похоже на ваше оригинальное решение; Таким образом, это, возможно, более легким для вас, чтобы помнить: процесс

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

мысль:

В VIM, чтобы удалить^M вы набираете:

%s:/^M//g 

Где^Ваш Ctrl и M - клавиша ENTER. Но я никогда не мог вспомнить ключи типа для печати этой последовательности, так что я всегда удалил их с помощью:

%s:/\r//g 

Так что мой вычет является то, что \ г и^М эквивалентны, причем первого легче не забудьте напечатать.

+0

Спасибо за ваш ответ, но, к сожалению, ничего не добавляет к тому, что у меня уже есть ... Я использую тот же метод для удаления^M, если я в vim и использую fromdos, когда я нахожусь вне – denormalizer

0

GNU найти

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

Я не знаю, что вы хотите сделать после того, как вы найдете те PHP файлы DOS, но если вы хотите, чтобы преобразовать их в формат UNIX, а затем

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

будет достаточно. Нет необходимости конкретно проверять, являются ли они файлами DOS или нет.

+0

, это аналогичный метод to @pvpb ... но этого все еще не хватает ... не возвращая ожидаемые результаты (потому что все файлы PHP сообщают, что они являются файлами текста PHP-скрипта) – denormalizer

1

я имел счастье с

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

Это более или менее похоже на принятый ответ, кроме него использует exec вместо xargs. Я обнаружил, что xargs будет значительно быстрее, в этом случае, по крайней мере. – denormalizer

0

Если вы предпочитаете ВИМ сказать вам, какие файлы в этом формате вы можете использовать следующий скрипт:

"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 

ваш ВИМ должен быть собран с python (python используется для перебора файлов в папке, возможно, это более простой способ сделать это, но я этого не знаю ...