Как я могу запустить 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.