Как я могу запустить dos2unix для всего каталога? [закрыто]


333

Я должен конвертировать весь каталог, используя dos2unix. Я не могу понять, как это сделать.

Ответы:


591

find . -type f -print0 | xargs -0 dos2unix

Рекурсивно найдет все файлы в текущем каталоге и вызовет эти файлы командой dos2unix


94
Сломался бы, если бы у вас были пробелы в имени файла. find . -type f -print0 | xargs -0 dos2unixрешил бы проблему, я думаю.
— Нуфал Ибрагим

1
я дал такую ​​находку. -type f -exec dos2unix {} / home / venuk / Desktop / NEO_Src, и он дал сообщение об ошибке: отсутствует аргумент для `-exec '
— Vivek Gaur

1
Обратите внимание, что обратная косая черта, которая выходит за точку с запятой, обеспечивает то, что команды dos2unix разделяются точками с запятой, чтобы они не смешивались. Если после этого вы захотите выполнить еще одну команду, вам понадобится еще одна точка с запятой, поэтому\;; echo Hello
— Джош,

1
Будьте осторожны с этой командой, она не проверяет, нуждается ли файл в преобразовании, поэтому даже двоичные файлы будут «преобразованы», что приведет к их повреждению.
— vguzmanp

2
@vguzmanp Правда, findвызов не выполняет эту проверку (хотя это было бы достаточно просто добавить), но современные dos2unixправильно пропускают двоичные файлы.
— Кайл Стрэнд

68

Если это большой каталог, вы можете рассмотреть возможность работы с несколькими процессорами:

find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix 

Это передаст 1 файл за раз, и использовать 4 процессора.


1
Преимущество этого метода в том, что он продолжается, несмотря на то, что у dos2unix возникли проблемы! Что-то вроде метода "--force". Спасибо вам за это!
— бесплатно

Ничего себе - просто сэкономил мне много времени на решение проблем, когда я пытался преобразовать дополнения кода разработчиков Windows, в которых кровать была добавлена ​​в git неправильно. Спасибо!!
— NetYeti

1
Запуск нового процесса dos2unix для каждого отдельного файла приведет к огромным ненужным накладным расходам. Я бы nувеличил это на порядок или два (в зависимости от того, сколько файлов мы здесь говорим)
— JonoCoetzee,

25

Так как dos2unix мне не понравился, я развернул свою простую утилиту. Помимо нескольких преимуществ в скорости и предсказуемости, синтаксис также немного проще:

endlines unix *

И если вы хотите, чтобы он заходил в подкаталоги (пропуская скрытые каталоги и нетекстовые файлы):

endlines unix -r .

endlinesдоступно здесь https://github.com/mdolidon/endlines


1
Это потрясающе! Ближайшая строка,
— которую

2
Как это улучшить dos2unix? Искренне любопытно
— Уолф

3
1 / В основном, существует множество различных dos2unixвозможностей с различными возможностями (некоторые читают UTF32, например, а некоторые нет; конечные строки - нет). Есть только один endlines, возможности которого хорошо известны. 2 / либеральные на входе не все dos2unixтакие. 3 / эффективное исследование дерева файлов, разработанное для быстрой и практичной работы с десятками тысяч файлов. 4 / выходит из коробки на OSX - что менее важно сейчас, когда существует пакет Brew.
— Матиас Долидон

1
В моем случае это именно то, что мне нужно, большое спасибо. Возможности, которые приветствуются, - это простой способ обработки дерева каталогов и быстрое время выполнения.
— АльСави

17

Вероятно, лучше пропустить скрытые файлы и папки, например, .git.вместо использования find, если ваша bashверсия достаточно свежая или вы используете zsh, просто сделайте:

dos2unix **

Обратите внимание, что для Bash это потребует:

shopt -s globstar

.... но это достаточно полезная функция, которую вы, честно говоря, должны просто вставить в свой .bashrc.

Если вы не хотите пропускать скрытые файлы и папки, но по-прежнему не хотите связываться find(и я бы не стал вас винить), вы можете предоставить второй аргумент recursive-glob, чтобы соответствовать только скрытым записям:

dos2unix ** **/.*

Обратите внимание, что в обоих случаях глобус будет расширяться для включения каталогов, поэтому вы увидите следующее предупреждение (возможно, много раз): Skipping <dir>, not a regular file.


1
Это не сработало для меня. Работает ли синтаксис globstar для dos2unix? Я с успехом использовал globstar в другом месте, но не смог заставить это работать. Я использую Bash 4.3.11 (1)
— NS du Toit

@NSduToit * Оболочки в стиле NIX не позволяют исполняемым файлам изменять поведение расширения аргументов, потому что (в отличие от Windows) расширение аргументов выполняется до того, как исполняемый файл когда-либо получит аргументы. Поэтому я могу думать только о том, что у вас есть какой-то dos2unixпсевдоним, который влияет на расширение аргументов. Что выводится в type dos2unixвашей системе?
— Кайл Стрэнд

1
@NSduToit Здесь есть некоторая путаница. В моем ответе прямо говорится, что смысл использования **вместо find«пропустить скрытые файлы и папки, такие как .git». dos2unixникогда не видит скрытые файлы, потому **что не раскрывается, чтобы показать их. Если вы хотите , чтобы автоматически запускать dos2unixна скрытых файлов и папок, вы можете использовать findили будет расширяться только скрытые файлы и папки, в том числе (корневой директории), (родительский реж), а также любые другие скрытые записи в текущей папке. dos2unix ** **/.***/.*...
— Кайл Стрэнд

1
(Обратите внимание, что dos2unixпросто печатается Skipping <dir>, not a regular file.при запуске в каталоге, поэтому он работает ..и .является безопасным.) Кроме того, объединение lsс глобусом не является хорошим способом проверить, как расширяется глоб; используйте echoвместо: echo **напечатает аргументы, которые dos2unixполучает от dos2unix **.
— Кайл Стрэнд

1
Спасибо! Имеет смысл! Хорошо, у меня было совершенно неверное представление о том **, что подразумевается, и использование echoпроясняет.
— NS Du Toit

7

Обычный вариант использования, как представляется, заключается в стандартизации окончаний строк для всех файлов, переданных в репозиторий Git :

git ls-files | xargs dos2unix

Имейте в виду , что некоторые файлы (например *.sln, *.bat) и т.д., только используются в операционных системах Windows , и должны держатьCRLF окончание:

git ls-files '*.sln' '*.bat' | xargs unix2dos

При необходимости используйте .gitattributes


6

Для любых пользователей Solaris (я использую 5.10, может применяться и к более новым версиям, а также к другим системам Unix):

По умолчанию dos2unix не перезаписывает файл, он просто печатает обновленную версию на стандартный вывод, поэтому вам придется указать источник и цель, то есть дважды одно и то же имя:

find . -type f -exec dos2unix {} {} \;

2
for FILE in /var/www/html/files/*
do
 /usr/bin/dos2unix FILE
done

1
Добро пожаловать в переполнение стека. Хотя ваше решение является допустимым, было бы неплохо, если бы вы могли добавить к нему некоторые пояснения. Вы также можете сослаться на другие ответы, чтобы обосновать свой ответ. Пожалуйста, посмотрите на Как ответить для получения дополнительной информации.
— Квантур

2

У меня была такая же проблема, и благодаря сообщениям здесь я решил ее. Я знал, что у меня есть около ста файлов, и мне нужно было запустить его только для файлов * .js. find . -type f -name '*.js' -print0 | xargs -0 dos2unix

Спасибо за вашу помощь.


0

Я думаю, что самый простой способ:

dos2unix $(find . -type f)

0

Я гуглял это миллион раз, поэтому мое решение - просто включить эту функцию bash в вашу среду.

.bashrcили .profileили любой другой

dos2unixd() {
  find $1 -type f -print0 | xargs -0 dos2unix
}

использование

$ dos2unixd ./somepath

Таким образом, у вас все еще есть оригинальная команда, dos2unixи это легко запомнить dos2unixd.


-1

Если нет подкаталога, вы также можете взять

ls | xargs -I {} dos2unix "{}"

4
Если нет подкаталогов, dos2unix *это проще и на самом деле будет более надежным, чем это. (Обычно не рекомендуется передавать выходные данные ls, потому что это инструмент форматирования и *более надежный для программного использования.)
— Kyle Strand

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.