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

  • Разделение CSV с многострочными ячейками
  • Как `tee` удалять все строки CR только в файле, но не stdout?
  • sed: чтение всего файла в пространство шаблонов без сбоев при однострочном вводе
  • Добавление / удаление некоторых вкладок и разрывов строк в HTML-коде с помощью sed
  • Удалите специальный шаблон ^ M из скрипта, который добавлен после FTP из окон в Unix
  • Как поместить символ новой строки в файл с помощью команды echo и оператора перенаправления?
  • строка shebang не работает с 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 
    Interesting Posts

    Использование sed для скобок

    В чем разница между основным разделом и логическим разделом в Linux?

    перезаписать данные раздела ext4 без предварительного удаления

    Предотвращение случайного удаления каталогов. Создание псевдонима, содержащего параметры?

    Debian не тестирует SDDM

    LFTP: зеркало к удаленному, кроме отдельного файла, присутствующего на удаленном

    Как избавиться от «сканирования файловых систем btrfs» при запуске?

    установить php5-fpm на Squeeze Debian

    Как rsync между двумя серверами через их общий хост Windows

    Запуск ядра реального времени на Debian

    Как узнать, какие диски находятся на адаптере QLogic FC на Linux?

    Как узнать, что мешает моей системе монетного двора Linux?

    Работа Debian не будет загружаться. Только с nomodeset, установленным в grub

    TFTP не прослушивает определенный порт при запуске с использованием правила xinetd

    Переименовать файлы в индекс

    Linux и Unix - лучшая ОС в мире.