У меня есть куча (сотни) файлов, которые должны иметь окончания строки Unix. Я сильно подозреваю, что у некоторых из них есть окончания строк Windows, и я хочу программно выяснить, какие именно.
Я знаю, что могу просто бежать
flip -uor something similar in a script to convert everything, but I want to be able to identify those files that need changing first.





Windows использует символы 13 и 10 для окончания строки, unix только один из них (я не помню, какой). Таким образом, вы можете заменить char 13 и 10 на char 13 или 10 (тот, который использует unix).
Вы можете использовать инструмент file, который сообщит вам тип окончания строки. Или вы можете просто использовать dos2unix -U, который преобразует все в окончание строк Unix, независимо от того, с чего он начинался.
@Fedir: Да, это так, просто если у файла есть обычные окончания строк LF, то он не будет выводить никаких результатов. Но если в файле есть окончания CRLF, CR или смешанные строки, он сообщит вам об этом.
Не работал у меня с Perl-скриптом только для CRLF в OS X. Может быть, расширение GNU?
Это работает с некоторыми типами файлов, но не работает с другими. В Linux он не сообщает, например, окончания строк для файлов html.
"file foo.txt" отлично работал в OS X 10.9. Он напечатал «foo.txt: текст ASCII с терминаторами строки CRLF»
Почти 10 лет спустя, безусловно, стоит упомянуть, что dos2unix имеет опцию -i для получения информации о файле. Я считаю, что это самый надежный способ определить виновных. Это также описано в unix.stackexchange.com/a/231408/17800
Unix использует один байт, 0x0A (LineFeed), тогда как Windows использует два байта, 0x0D 0x0A (возврат каретки, перевод строки).
Если вы никогда не видите 0x0D, скорее всего, это Unix. Если вы видите пары 0x0D 0x0A, скорее всего, это MSDOS.
Вы можете использовать grep
egrep -l $'\r'$ *
по какой-то причине, когда я запускаю эту команду в оболочке MacOS X, я получаю список всех файлов в каталоге. Даже тот, который я недавно сгенерировал с помощью "echo" test "> torderform6.cpp". Есть идеи, что может пойти не так?
Он просто перечисляет все файлы в папке для меня в Ubuntu.
Эта команда по-прежнему будет выводить список файлов, на которых был запущен dos2unix.
используйте $(echo -e '\r'). Если у вас нет bash, выполните расширение ASCII за вас (замените $'\r'$ на него)
На Mac я использую: grep -E -rl '\ r'.
Что-то вроде:
perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME
хотя некоторые из этих регулярных выражений могут нуждаться в доработке и приведении в порядок.
Это выведет ваш файл с WIN, MAC или UNIX в конце каждой строки. Хорошо, если ваш файл представляет собой ужасный беспорядок (или разногласия) и имеет смешанные окончания.
Работал для меня на Ubuntu, принятый ответ, похоже, просто перечисляет все файлы
У меня не работает, дает: Unmatched ) in regex; marked by <-- HERE in m/(?<!WIN) <-- HERE \n/ at -e line 1.
вам необходимо заменить & lt; с <
Символ < был испорчен при предыдущем редактировании. Я исправил это сейчас.
Когда вы знаете, какие файлы имеют окончания строки Windows (0x0D 0x0A или \r \n), что вы будете делать с этими файлами? Я полагаю, вы конвертируете их в концы строк Unix (0x0A или \n). Вы можете преобразовать файл с окончанием строки Windows в окончания строки Unix с помощью утилиты sed, просто используйте команду:
$> sed -i 's/\r//' my_file_with_win_line_endings.txt
Вы можете поместить это в скрипт следующим образом:
#!/bin/bash
function travers()
{
for file in $(ls); do
if [ -f "${file}" ]; then
sed -i 's/\r//' "${file}"
elif [ -d "${file}" ]; then
cd "${file}"
travers
cd ..
fi
done
}
travers
Если вы запустите его из корневого каталога с файлами, в конце вы будете уверены, что все файлы имеют окончание строки Unix.
Вот самый надежный ответ. Ответ Stimms не учитывает подкаталоги и двоичные файлы
find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print }'
file, чтобы найти тип файла. Те, у кого есть CRLF, имеют символы возврата Windows. Вывод file ограничен :, и первое поле - это путь к файлу.Действительно самый безотказный способ. Чтобы преобразовать только все найденные файлы, просто запустите find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print }' | xargs flip -ub.
В большинстве случаев это не безопасно - file не всегда даже сообщает "CRLF" в своем выводе, это зависит от типа файла. Я обнаружил, что для файлов SVG, содержащих текст, очень похожих на файлы с открытым текстом, file не упоминает тип используемого окончания строки. Таким образом, этот сценарий не зависит от типа файла. Просто говорю. В остальном выглядит разумным однострочником, без учета вышеупомянутых ограничений.
файл не показывает конец строки. Бывший. : "файл .bashrc => .bashrc: текст ASCII на английском языке" Нужны дополнительные ключи?