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