Как определить файлы формата dos в git bash

Git Bash – отличная оболочка bash, которую вы получаете в Windows, как часть установки Git. Он поставляется с другими типичными инструментами unix, входящими в комплект, такими как grep, sed, awk, perl. У него нет команды file.

В этой оболочке я хочу обнаружить файлы, имеющие окончания строки в стиле DOS. Я думал, что эта команда будет работать, но это не так:

grep -l ^M$ * 

Он не работает, даже файлы, у которых нет окончаний линии CR, совпадают. Например, если я создаю 2 образца файлов hello.unix и hello.dos , я могу подтвердить с помощью wc что hello.unix имеет 6 символов, а hello.dos имеет 7 символов из-за дополнительного CR, но оба файла соответствуют grep . То есть:

 $ cat hello.* hello hello $ wc hello.* 1 1 7 hello.dos 1 1 6 hello.unix 2 2 13 total $ grep -l ^M hello.* hello.dos hello.unix 

Это ошибка в реализации grep в Git Bash? Есть ли другой способ найти все файлы с концами в стиле DOS?

5 Solutions collect form web for “Как определить файлы формата dos в git bash”

EDIT: Глупый меня. Конечно, M – CR; и ваша команда должна работать (работает в моей системе). Однако вам нужно набрать Ctrl-V Ctrl-M, чтобы получить литерал '\ 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' 

Вы также можете использовать служебную программу (не уверен, что она связана с GIT bash):

 find dir -type f -print0 | xargs -0 file | grep CRLF 

Я не знаю о git bash, но, может быть,

 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 

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

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

Это завершает работу с ИСТИНА, если в файле есть строки, заканчивающиеся на CR. Чтобы подключить это, найдите:

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

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

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

Вы можете решить эту проблему с помощью Python:

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

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

Используйте команду 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 
  • Как правильно добавить концы строк с помощью sed?
  • Проблема с горизонтальным слиянием csv-файлов под Cygwin
  • Заменить \ n на новую строку в sed portably
  • Как разбить длинную строку на несколько строк в подсказке read -p в исходном коде?
  • Почему непоследовательность с использованием cat и echo для этой команды sed?
  • Я хочу использовать «sed» для вставки новых строк (одна строка превращается в сотни)
  • \ n печатает n вместо новой строки при использовании sed в MaxOSX
  • Почему это, что для новой строки работает, но с новой строкой, не работает sed?
  • Как поместить символ новой строки в файл с помощью команды echo и оператора перенаправления?
  • Команда sed: N не читает одну строку
  • Сценарий оболочки работает при сохранении с помощью nano, но не при сохранении с помощью Notepad ++
  • Показывать точное количество записей CRLF в файле
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.