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

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

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

  • Заменить сценарии развертывания с помощью незамысловатого
  • Быстрая утилита, которая индексирует файлы / каталоги на centos 6 для более быстрого поиска через файловую систему
  • Как удалить файл с именем «°» в bash
  • Почему $ # всегда 0 в моей функции?
  • Множественное сопоставление столбцов и настройка с помощью awk
  • chmod не работает на Mac
  • 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?

  • grep IP-адреса в сценарии ожиданий
  • WMCTRL не работает после запуска xfce4-terminal
  • GREP для процессов по каталогам и убить его
  • Как влиять на цикл bash while с временной глобальной переменной?
  • bash: Некоторая проблема при использовании read <<< "$ VARIABLE" в корневом разделе только для чтения. Любые известные обходные пути?
  • Можно ли изменить порядок глобуса?
  • 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 - лучшая ОС в мире.