Как обнаружить файлы формата DOS в ударе мерзавца

Испытайте это руководство от debian форума.
Похож на драйвер от производителя, содержал низкое качество и был для этого выведен в какой-то момент.

4
20.12.2014, 13:01
5 ответов

@sch имеет, приводят меня к этому решению:

sed -bne '/\r$/ {p;q}' < /path/to/file | grep -q .

Это выходит с TRUE, если файл имеет какие-либо строки, заканчивающиеся CR. Сцеплять это в находку:

find /path/to/ -type f -exec sh -c 'sed -bne "/\r$/ {p;q}" < "$1" | grep -q .' sh {} \; -print

И я думаю, что знаю почему grep -l ^M hello.* не работает в этой оболочке: это кажется этим в Bash Мерзавца ^M символы удалены из всех параметров командной строки, таким образом, grep никогда на самом деле получает символ и поэтому все соответствие файлов. Это поведение не находится только на командной строке, но и в сценариях оболочки также.

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

1
27.01.2020, 20:51

Править: Глупый я. Конечно, ^M является CR; и Ваша команда должна работать (работы над моей системой). Однако необходимо ввести Ctrl-M Ctrl-V для получения литерала '\r '/CR (а не два символа, ^ и M).

Альтернативы:

Сделайте это:

find dir -type f -print0 | xargs -0 grep -l `printf '\r\n'`

Или это:

find dir -type f -print0 | xargs -0 grep -lP '\r\n'

Можно также использовать утилиту файла (не уверенный, если она идет с ударом МЕРЗАВЦА):

find dir -type f -print0 | xargs -0 file | grep CRLF
4
27.01.2020, 20:51
  • 1
    Да это должно обычно работать, но это не работает в Bash Мерзавца. К сожалению, ни одна из Вашей работы подсказок: printf не работает, grep не имеет -P флаг, и существует нет file команда в Bash Мерзавца... Какие-либо другие идеи? –  janos 11.10.2012, 13:01
  • 2
    Как насчет `echo -e '\r\n'`? Должен сделать то же как printf. –  January 11.10.2012, 13:13
  • 3
    То же как printf, ни один из файлов не соответствует тому пути. –  janos 11.10.2012, 15:07
  • 4
    Гм, настолько наиболее вероятная ошибка. Вам устанавливали компилятор C? Я могу записать Вам немного программы C, которая должна работать. –  January 11.10.2012, 15:41
  • 5
    Никакой gcc или cc не идут с Bash Мерзавца. Я не хочу устанавливать cygwin. Так, спасибо, но nevermind. Мое обходное решение должно преобразовать все файлы, которые я подозреваю, чтобы иметь окончания строки CR. Файлы, которые не имеют, не будут изменены так, это должно быть в порядке, это - просто ужасное решение. гибкость –  janos 11.10.2012, 16:00

Я не знаю об ударе мерзавца, но возможно

if [ "$(tr -cd '\r' < file | wc -c)" -gt 0 ]; then
  echo there are CR characters in there
fi

работал бы. Идея быть для не использования текстовых утилит, которые могут рассматривать символы CR и LF особенно.

Если это не работает, то, возможно,

if od -An -tx1 < file | grep -q 0d; then
  echo there are CR characters in there
fi

Сцепляться в находку:

find . -type f -exec sh -c 'od -An -tx1 < "$1" | grep -q 0d' sh {} \; -print
2
27.01.2020, 20:51
  • 1
    Нет od в Bash мерзавца. Но tr прием довольно умен, и он работает! Существует всего одна относительно незначительная проблема с ним: это обнаруживает CR где угодно в файле, но я должен обнаружить CR при окончаниях строки. Вы имеете, приводят меня к решению, с помощью sed вместо tr. Дополнительную информацию см. в моем ответе, и еще раз спасибо! –  janos 12.10.2012, 11:44
  • 2
    Когда CR используется за пределами окончаний строки? –  Didi Kohen 12.10.2012, 14:46

Можно решить его с помощью Python:

import string
import fileinput

for line in fileinput.input():
    if (string.find(line,"\r")!=-1):
        print fileinput.filename()
        fileinput.nextfile()

Этот маленький файл Python вел бы себя точно так же, как Вы будете ожидать grep (получите список имени файла и распечатайте имена с CR в них).

0
27.01.2020, 20:51

Используйте команду file в Linux / Ubuntu. Если файл находится в формате DOS, вывод будет включать слова «с терминаторами строк CRLF». Если файл находится в формате UNIX, таких слов в выводе не будет. В приведенном ниже примере del.txt находится в формате DOS, а del - в формате UNIX.

$ file del.txt
del.txt: C source, ASCII text, with CRLF line terminators
$ echo "hello" > del
user@decatur2:~/manpuriav$ file del
del: ASCII text
0
27.01.2020, 20:51

Теги

Похожие вопросы