Я повинен перетворити цілий каталог за допомогою 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
Це передасть один файл за один раз і використовувати 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.So замість того, щоб використовувати find, якщо ваша bashверсія досить недавня або ви використовуєте zsh, просто зробіть:
dos2unix **
Зауважте, що для Bash для цього знадобиться:
shopt -s globstar
.... але це досить корисна функція, яку вам чесно потрібно просто помістити у свій спосіб .bashrc.
Якщо ви не хочете пропускати приховані файли та папки, але ви все одно не хочете возитися find(і я б не звинувачував вас), ви можете надати другий рекурсивний глобальний аргумент, щоб відповідати лише прихованим записам :
dos2unix ** **/.*
Зауважте, що в обох випадках глобус розшириться до каталогів, тож ви побачите таке попередження (можливо, багато разів): Skipping <dir>, not a regular file.
dos2unixпсевдонім, який впливає на розширення аргументів. Який вихід у type dos2unixвашій системі?
**замість цього findє "пропуск прихованих файлів і папок, таких як .git". dos2unixніколи не бачить приховані файли, оскільки **не розгортається, щоб їх показати. Якщо ви хочете автоматично запускатись dos2unixна прихованих файлах і папках, ви можете використовувати findабо dos2unix ** **/.*The **/.*розширити лише приховані файли та папки, включаючи .(кореневий dir), ..(батьківський dir) та будь-які інші приховані записи в поточній папці.
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 не за замовчуванням перезаписує файл, він просто надрукує оновлену версію до stdout, тому вам доведеться вказати джерело та ціль, тобто те саме ім’я двічі:
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вирішив би проблему, яку я думаю.