Мне нужен способ найти все файлы, содержащие нечетные ^ M невидимые символы - PullRequest
1 голос
/ 03 ноября 2011

Я точно знаю, что эти PHP-файлы существуют.Я могу открыть их в VIM и увидеть оскорбительный символ.

Я нашел несколько ссылок здесь на stackoverflow, которые предлагают способы устранения этой проблемы, но ни одна из них не работает должным образом.Я точно знаю, что несколько файлов не содержат символов ^ M (окончания строк CRLF), однако я получаю ложные срабатывания.

find . -type f -name "*.php" -exec fgrep -l $'\r' "{}" \;

Возвращает ложные срабатывания.

find . -not -type d -name "*.php" -exec file "{}" ";" | grep CRLF

Ничего не возвращает.

и т. Д. И т. Д. *

Редактировать: Да, я выполняю эти строки в каталоге-нарушителе.

Ответы [ 4 ]

1 голос
/ 03 ноября 2011

Небольшой Perl может не только раскрывать файлы, но и изменять их по своему желанию. Чтобы найти виновных, сделайте:

find . -type f -name "*.php" -exec perl -ne 'print $ARGV if m{\r$}' {} + > badstuff

Теперь, если вы хотите удалить досадный возврат каретки:

perl -pe 's{\r$}{}' $(<badstuff)

... что исключает возврат каретки из всех затронутых файлов. Если вы хотите сделать это и создать резервную копию, выполните:

perl -pi.old -e 's{\r$}{}' $(<badstuff)
1 голос
/ 03 ноября 2011

Используете ли вы хранилище контроля версий для хранения ваших файлов? Многие из них имеют возможность автоматически проверять правильность концов строк в файлах при коммите. Я могу привести пример с Subversion.

У меня есть ловушка для предварительной фиксации , которая позволяет мне указать, какие свойства в Subversion должны быть для каких файлов, чтобы эти файлы были зафиксированы. Например, я мог бы указать, что любой файл, который заканчивается на *.php, должен иметь свойство svn:eol-style, установленное на LF.

Если вы используете это, у вас никогда не возникнет проблем с окончанием строки ^M.

Что касается их поиска, я смог сделать это:

$ find . -type f -exec egrep -l "^M$" {} \;

Где ^M - это Control-M. С помощью Bash или Kornshell вы можете получить это, нажав Control-V, затем Control-M. Возможно, вам понадобится set -o vi, чтобы он заработал.

0 голосов
/ 03 ноября 2011

Я склонен использовать инструкции, предоставленные на http://kb.iu.edu/data/agiz.html, чтобы сделать это.Следующее изменит ^ ^ в определенном файле на \ n возврат и поместит его в новый файл, используя tr:

 tr '\r' '\n' < macfile.txt > unixfile.txt

Это делает то же самое, просто используя perl.С этим вы, вероятно, можете передать в ряд файлов:

  perl -p -e 's/\r/\n/g'  < macfile.txt > unixfile.txt
0 голосов
/ 03 ноября 2011

Команда file сообщит вам, какие типы символов конца строки она видит:

$ file to-do.txt
to-do.txt: ASCII text, with CRLF line terminators
$ file mixed.txt
mixed.txt: ASCII text, with CRLF, LF line terminators

Таким образом, вы можете запустить, например,

find . -type f -name "*.php" -exec file "{}" \; | grep -c CRLF

для подсчета количества файловкоторые имеют по крайней мере несколько концов строк CRLF.

Вы также можете использовать dos2unix или fromdos, чтобы преобразовать их все только в LF:

find . -type f -name "*.php" -exec dos2unix "{}" \;

Вам также может быть интересно, если эти инструментыкоснется всех файлов, или только те, которые должны быть преобразованы;проверить документацию на инструмент

...