Я должен конвертировать весь каталог, используя 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
решил бы проблему, я думаю.