Як я можу запустити 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 

Це передасть один файл за один раз і використовувати 4 процесори.


1
Перевага цього методу полягає в тому, що він продовжується, навіть незважаючи на те, що dos2unix стикається з будь-якими проблемами! Щось на зразок методу "- сила". Дякую тобі за це!
freeo

Нічого собі - я просто врятував мені багато часу на вирішення проблем під час спроби перетворити доповнення коду для розробників Windows, у яких було додано ліжко до git неправильно. Дякую!!
The 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
У моєму випадку це саме те, що мені було потрібно спасибі. Запропоновані функції - простий спосіб обробки дерева каталогів та швидкий час виконання.
AlSavi

17

Мабуть, найкраще пропустити приховані файли та папки, наприклад, .git.So замість того, щоб використовувати find, якщо ваша bashверсія досить недавня або ви використовуєте zsh, просто зробіть:

dos2unix **

Зауважте, що для Bash для цього знадобиться:

shopt -s globstar

.... але це досить корисна функція, яку вам чесно потрібно просто помістити у свій спосіб .bashrc.

Якщо ви не хочете пропускати приховані файли та папки, але ви все одно не хочете возитися find(і я б не звинувачував вас), ви можете надати другий рекурсивний глобальний аргумент, щоб відповідати лише прихованим записам :

dos2unix ** **/.*

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


1
Це не спрацювало для мене. Чи працює синтаксис globstar для dos2unix? Я з успіхом використовував глобальний індекс, але не міг змусити це працювати. Я використовую Bash 4.3.11 (1)
NS du Toit

Оболонки стилю @NSduToit * NIX не дозволяють виконуваним файлам змінювати поведінку розширення аргументів, оскільки (на відміну від Windows) розширення аргументів виконується до того, як виконуваний файл коли-небудь отримує аргументи. Тож єдине, про що я можу придумати, - це те, що у вас є якийсь dos2unixпсевдонім, який впливає на розширення аргументів. Який вихід у type dos2unixвашій системі?
Кайл Странд

1
@NSduToit Тут є деяка плутанина. У моїй відповіді прямо вказано, що сенсом використання **замість цього findє "пропуск прихованих файлів і папок, таких як .git". dos2unixніколи не бачить приховані файли, оскільки **не розгортається, щоб їх показати. Якщо ви хочете автоматично запускатись dos2unixна прихованих файлах і папках, ви можете використовувати findабо dos2unix ** **/.*The **/.*розширити лише приховані файли та папки, включаючи .(кореневий dir), ..(батьківський dir) та будь-які інші приховані записи в поточній папці.
Кайл Странд

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 не за замовчуванням перезаписує файл, він просто надрукує оновлену версію до stdout, тому вам доведеться вказати джерело та ціль, тобто те саме ім’я двічі:

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

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