Как определить файлы формата 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?

  • Каталоги перечислены дважды
  • конец строки в linux и mac
  • Почему я получаю «строка 1: $ ': \ r': command not found"?
  • bash читает новую строку, printf сообщает символ 0
  • Как сопоставить заголовки Markdown Setext в буйных ctags
  • Баш читал с разделителем прошлых строк
  • новые строки и переменная bash
  • Передача файлов из AIX в Windows - проблемы с CR и LF (управляющие символы)
  • 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 
    Linux и Unix - лучшая ОС в мире.