Как найти файлы формата DOS в файловой системе Linux - PullRequest
12 голосов
/ 18 января 2011

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

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

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

Это не дает мне надежных результатов ... поэтому я ищу лучшую альтернативу.

Есть предложения, идеи?

Спасибо

Разъяснение

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

Способ, которым я в настоящее время определяю, является ли файл дос или нет, через Vim, где внизу написано:

"filename.php" [dos] [noeol]

Ответы [ 7 ]

14 голосов
/ 18 января 2011

Как насчет:

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

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

9 голосов
/ 18 января 2011

Не уверен, что именно вы подразумеваете под "ненадежным", но вы можете попробовать:

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

При этом используется более зверские имена файлов с пробелами в них дружественные опций и находит только возврат каретки непосредственно перед концом строки.

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

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


На основании вашего обновления vim сообщает о ваших файлах в формате DOS:

Если vim равен , сообщая об этомкак формат DOS, то каждая строка заканчивается CRLF.Так работает Vim.Если даже одна строка не имеет CR, то это считается форматом UNIX и символы ^M видны в буфере.Если используется весь формат DOS, символы ^M не отображаются:

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

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

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

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

od -xcb input_file_name | less

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

1 голос
/ 23 февраля 2012

мне повезло с

find . -name "*.php" -exec grep -Pl "\r" {} \;
1 голос
/ 18 января 2011

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

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

Процесс мышления:

В VIM удалить ^ M, который вы вводите:

 %s:/^M//g

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

 %s:/\r//g

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

0 голосов
/ 24 января 2019

Если ваша команда dos2unix имеет параметр -i, вы можете использовать эту функцию для поиска файлов в каталоге с разрывами строки DOS.

$ man dos2unix
.
.
.
     -i[FLAGS], --info[=FLAGS] FILE ...
           Display file information. No conversion is done.

    The following information is printed, in this order:
    number of DOS line breaks,
    number of Unix line breaks,
    number of Mac line breaks,
    byte order mark,
    text or binary, file name.
.
.
.
Optionally extra flags can be set to change the (-i) output.
.
.
.
           c   Print only the files that would be converted.

Следующий однострочный скрипт читает:

  • find все файлы в этом дереве каталогов,
  • запустить dos2unix для всех файлов, чтобы определить файлы, которые будут изменены,
  • запустить dos2unixна файлы, которые будут изменены

$ find . -type f | xargs -d '\n' dos2unix -ic | xargs -d '\n' dos2unix

0 голосов
/ 11 октября 2012

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

"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 должен быть скомпилирован с python (python используется для циклического перемещения по файлам в папке, возможно, есть более простой способ сделать это, но я действительно не знаю этого ...

0 голосов
/ 18 января 2011

GNU найти

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

Я не знаю, что вы хотите делать после того, как найдете эти php-файлы для DOS, но если вы хотите конвертировать их в формат unix,

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...