Я должен конвертировать весь каталог, используя dos2unix. Я не могу понять, как это сделать.
Я должен конвертировать весь каталог, используя dos2unix. Я не могу понять, как это сделать.
Ответы:
find . -type f -print0 | xargs -0 dos2unix
Рекурсивно найдет все файлы в текущем каталоге и вызовет эти файлы командой dos2unix
\;; echo Hello
findвызов не выполняет эту проверку (хотя это было бы достаточно просто добавить), но современные dos2unixправильно пропускают двоичные файлы.
Если это большой каталог, вы можете рассмотреть возможность работы с несколькими процессорами:
find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
Это передаст 1 файл за раз, и использовать 4 процессора.
nувеличил это на порядок или два (в зависимости от того, сколько файлов мы здесь говорим)
Так как dos2unix мне не понравился, я развернул свою простую утилиту. Помимо нескольких преимуществ в скорости и предсказуемости, синтаксис также немного проще:
endlines unix *
И если вы хотите, чтобы он заходил в подкаталоги (пропуская скрытые каталоги и нетекстовые файлы):
endlines unix -r .
endlinesдоступно здесь https://github.com/mdolidon/endlines
dos2unix? Искренне любопытно
dos2unixвозможностей с различными возможностями (некоторые читают UTF32, например, а некоторые нет; конечные строки - нет). Есть только один endlines, возможности которого хорошо известны. 2 / либеральные на входе не все dos2unixтакие. 3 / эффективное исследование дерева файлов, разработанное для быстрой и практичной работы с десятками тысяч файлов. 4 / выходит из коробки на OSX - что менее важно сейчас, когда существует пакет Brew.
Вероятно, лучше пропустить скрытые файлы и папки, например, .git.вместо использования find, если ваша bashверсия достаточно свежая или вы используете zsh, просто сделайте:
dos2unix **
Обратите внимание, что для Bash это потребует:
shopt -s globstar
.... но это достаточно полезная функция, которую вы, честно говоря, должны просто вставить в свой .bashrc.
Если вы не хотите пропускать скрытые файлы и папки, но по-прежнему не хотите связываться find(и я бы не стал вас винить), вы можете предоставить второй аргумент recursive-glob, чтобы соответствовать только скрытым записям:
dos2unix ** **/.*
Обратите внимание, что в обоих случаях глобус будет расширяться для включения каталогов, поэтому вы увидите следующее предупреждение (возможно, много раз): Skipping <dir>, not a regular file.
dos2unixпсевдоним, который влияет на расширение аргументов. Что выводится в type dos2unixвашей системе?
**вместо find«пропустить скрытые файлы и папки, такие как .git». dos2unixникогда не видит скрытые файлы, потому **что не раскрывается, чтобы показать их. Если вы хотите , чтобы автоматически запускать dos2unixна скрытых файлов и папок, вы можете использовать findили будет расширяться только скрытые файлы и папки, в том числе (корневой директории), (родительский реж), а также любые другие скрытые записи в текущей папке. dos2unix ** **/.***/.*...
dos2unixпросто печатается Skipping <dir>, not a regular file.при запуске в каталоге, поэтому он работает ..и .является безопасным.) Кроме того, объединение lsс глобусом не является хорошим способом проверить, как расширяется глоб; используйте echoвместо: echo **напечатает аргументы, которые dos2unixполучает от dos2unix **.
**, что подразумевается, и использование echoпроясняет.
Обычный вариант использования, как представляется, заключается в стандартизации окончаний строк для всех файлов, переданных в репозиторий Git :
git ls-files | xargs dos2unix
Имейте в виду , что некоторые файлы (например *.sln, *.bat) и т.д., только используются в операционных системах Windows , и должны держатьCRLF окончание:
git ls-files '*.sln' '*.bat' | xargs unix2dos
При необходимости используйте .gitattributes
Для любых пользователей Solaris (я использую 5.10, может применяться и к более новым версиям, а также к другим системам Unix):
По умолчанию dos2unix не перезаписывает файл, он просто печатает обновленную версию на стандартный вывод, поэтому вам придется указать источник и цель, то есть дважды одно и то же имя:
find . -type f -exec dos2unix {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
Я гуглял это миллион раз, поэтому мое решение - просто включить эту функцию bash в вашу среду.
.bashrcили .profileили любой другой
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
использование
$ dos2unixd ./somepath
Таким образом, у вас все еще есть оригинальная команда, dos2unixи это легко запомнить dos2unixd.
Если нет подкаталога, вы также можете взять
ls | xargs -I {} dos2unix "{}"
dos2unix *это проще и на самом деле будет более надежным, чем это. (Обычно не рекомендуется передавать выходные данные ls, потому что это инструмент форматирования и *более надежный для программного использования.)
find . -type f -print0 | xargs -0 dos2unixрешил бы проблему, я думаю.