Испытайте это руководство от debian форума.
Похож на драйвер от производителя, содержал низкое качество и был для этого выведен в какой-то момент.
@sch имеет, приводят меня к этому решению:
sed -bne '/\r$/ {p;q}' < /path/to/file | grep -q .
Это выходит с TRUE, если файл имеет какие-либо строки, заканчивающиеся CR. Сцеплять это в находку:
find /path/to/ -type f -exec sh -c 'sed -bne "/\r$/ {p;q}" < "$1" | grep -q .' sh {} \; -print
И я думаю, что знаю почему grep -l ^M hello.*
не работает в этой оболочке: это кажется этим в Bash Мерзавца ^M
символы удалены из всех параметров командной строки, таким образом, grep
никогда на самом деле получает символ и поэтому все соответствие файлов. Это поведение не находится только на командной строке, но и в сценариях оболочки также.
Таким образом, ключ должен выразить ^M
символ с другими символами, такой как \r
, вместо буквально.
Править: Глупый я. Конечно, ^M является CR; и Ваша команда должна работать (работы над моей системой). Однако необходимо ввести Ctrl-M Ctrl-V для получения литерала '\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'
Можно также использовать утилиту файла (не уверенный, если она идет с ударом МЕРЗАВЦА):
find dir -type f -print0 | xargs -0 file | grep CRLF
printf
не работает, grep
не имеет -P
флаг, и существует нет file
команда в Bash Мерзавца... Какие-либо другие идеи?
– janos
11.10.2012, 13:01
Я не знаю об ударе мерзавца, но возможно
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
od
в Bash мерзавца. Но tr
прием довольно умен, и он работает! Существует всего одна относительно незначительная проблема с ним: это обнаруживает CR где угодно в файле, но я должен обнаружить CR при окончаниях строки. Вы имеете, приводят меня к решению, с помощью sed
вместо tr
. Дополнительную информацию см. в моем ответе, и еще раз спасибо!
– janos
12.10.2012, 11:44
Можно решить его с помощью 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