ディレクトリ全体でdos2unixを実行するにはどうすればよいですか?[閉まっている]


333

を使用してディレクトリ全体を変換する必要がありdos2unixます。これを行う方法を理解することができません。

回答:


591

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

現在のディレクトリ内のすべてのファイルを再帰的に検索し、これらのファイルを呼び出すdos2unixコマンド


94
ファイル名にスペースが含まれていると壊れます。find . -type f -print0 | xargs -0 dos2unix私が思う問題を解決するでしょう。
Noufal Ibrahim 2012

1
私はこのような発見をしました。-type f -exec dos2unix {} / home / venuk / Desktop / NEO_Srcでエラーfind: `-exec 'の引数がありません
Vivek Gaur

1
セミコロンをエスケープするバックスラッシュは、dos2unixコマンドがセミコロンで区切られていることに注意してください。あなたはその後、別のコマンドを実行したい場合は、別のセミコロンが必要になりますので、\;; echo Hello
ジョシュ

1
ただし、このコマンドには注意してください。ファイルが変換を必要とするかどうかはチェックされないため、バイナリファイルでも「変換」されて破損します。
vguzmanp 2014

2
@vguzmanp確かに、find呼び出しではこのチェックは行われません(ただし、追加するのは簡単ですが)が、dos2unixバイナリファイルは正しくスキップされます。
カイルストランド

68

ディレクトリが大きい場合は、複数のプロセッサで実行することを検討してください。

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

これは一度に1つのファイルを渡し、4つのプロセッサを使用します。


1
この方法には、dos2unixで問題が発生しても続行できるという利点があります。「--force」メソッドのようなもの。有難うございます!
freeo

すごい-gitに誤ってベッドが追加されていたWindows開発者のコ​​ード追加を変換しようとしているときに、問題解決の時間を大幅に節約できました。ありがとうございました!!
NetYeti 2015

1
個々のファイルごとに新しいdos2unixプロセスを開始すると、非常に不要なオーバーヘッドが発生します。私はそれを1 n桁か2桁上げます(ここで話しているファイルの数によって異なります)
JonoCoetzee

25

たまたまdos2unixに満足できなかったので、自分の簡単なユーティリティを公開しました。速度と予測可能性におけるいくつかの利点の他に、構文も少し単純です。

endlines unix *

そして、サブディレクトリに移動したい場合(隠しディレクトリと非テキストファイルをスキップ):

endlines unix -r .

endlinesこちらから入手できますhttps://github.com/mdolidon/endlines


1
これは完璧です!私がこれに到達できる最も近いワンライナーはここにあります:unix.stackexchange.com/a/365679/112190
phyatt

2
それはどのように改善されdos2unixますか?真に好奇心が強い。
Walf

3
1 /主に、dos2unixさまざまな機能を持つさまざまながたくさんあります(たとえば、UTF32を読み取るものもあれば、しないものもありますが、エンドラインはそうではありません)。endlinesよく知られている機能は1つだけです。2 /入力に関しては自由ですが、すべてでdos2unixはありません。3 /数万のファイルで高速かつ実用的になるように設計された効率的なファイルツリー探索。4 /は、OSXでそのまま実行されます-Brewパッケージが存在するため、これはあまり重要ではありません。
Mathias Dolidon 2017

1
私の場合、それはまさに私が必要としているものです。歓迎される機能は、ディレクトリツリーを処理する簡単な方法と高速な実行時間です。
AlSavi

17

バージョンが十分に新しい場合、またはを使用している場合は、次のよう.git.に、を使用する代わりに、隠しファイルやフォルダーをスキップすることをお勧めします。findbashzsh

dos2unix **

Bashの場合、これには以下が必要です。

shopt -s globstar

....しかし、これは十分に便利な機能であり、.bashrcとにかく正直に入れておくべきです。

あなたがいる場合していないと隠しファイルとフォルダをスキップしたいのですが、あなたはまだ混乱したくないfind(と私はあなたを責めないだろう)、あなたが一致する2番目の再帰グロブ引数に提供できる唯一の隠されたエントリを:

dos2unix ** **/.*

どちらの場合も、グロブはディレクトリを含むように展開されるため、次の警告が表示されます(潜在的に何回か繰り返されます)。 Skipping <dir>, not a regular file.


1
これは私にはうまくいきませんでした。globstar構文はdos2unixで機能しますか?私は他の場所でglobstarを使用して成功しましたが、これを機能させることができませんでした。私は、(1)バッシュ4.3.11を使用しています
NSデュ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はデフォルトではファイルを上書きしません。更新されたバージョンをstdoutに出力するだけなので、ソースとターゲット、つまり同じ名前を2回指定する必要があります。

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

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

1
Stack Overflowへようこそ。あなたの解決策は有効な解決策ですが、何か説明を付け加えることができれば素晴らしいでしょう。また、他の回答を参照して回答を正当化することも検討してください。見ていてください答える方法の詳細については、を。
kvantour 2018年

2

私は同じ問題を抱えていて、ここの投稿のおかげで解決しました。約100個のファイルがあり、*。jsファイルに対してのみ実行する必要があることを知っていました。 find . -type f -name '*.js' -print0 | xargs -0 dos2unix

ご協力ありがとうございます。



0

私はこれを100万回ぐらい回したので、私の解決策はこの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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.