Как определить файлы формата 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: N не читает одну строку
  • конец строки в linux и mac
  • Баш читал с разделителем прошлых строк
  • Сценарий с ошибкой «команда не найдена: ^ M»
  • Сценарий оболочки работает при сохранении с помощью nano, но не при сохранении с помощью Notepad ++
  • Почему end-of-line $ anchor не работает с командой grep, даже если привязка front-of-line ^?
  • Как исправить сообщение «Hunk # 1 FAILED at 1 (different line endings)»?
  • Почему это, что для новой строки работает, но с новой строкой, не работает sed?
  • Как получить количество байтов в одной строке файла?
  • Добавление / удаление некоторых вкладок и разрывов строк в HTML-коде с помощью sed
  • Формирование новых строк с печатью подстановок кошки
  • Почему файловые системы * nix поддерживают имена файлов с символами новой строки?
  • Linux и Unix - лучшая ОС в мире.