13

ディレクトリとサブディレクトリ内のすべてのファイルのすべての EOL (dos->unix) を再帰的に変換するにはどうすればよいです dos2unixか? (持ってなくてインストールできません。)

tr -d '\r'とパイプを使用してそれを行う方法はありますか? もしそうなら、どのように?

4

7 に答える 7

14

現在のディレクトリ内のすべてのファイルに対して、Perl ワンライナーで実行できます: (ここperl -pi -e 's/\r\n/\n/g' *から盗まれました)

編集:そして、小さな変更を加えることで、サブディレクトリの再帰を行うことができます:

find | xargs perl -pi -e 's/\r\n/\n/g'
于 2012-05-17T04:13:56.443 に答える
11

sed の-iフラグを使用して、ファイルをその場で変更できます。

find . -type f -exec sed -i 's/\x0d//g' {} \+

もし私があなたなら、操作がうまくいくようにファイルを保管します。その後、完了したら一時ファイルを削除できます。これは次のように実行できます。

find . -type f -exec sed -i'.OLD' 's/\x0d//g' {} \+
find . -type f -name '*.OLD' -delete
于 2012-05-17T03:12:31.750 に答える
2

スペースなどを含まない適切なファイル名とディレクトリ名がありますか?

もしそうなら、それはそれほど難しいことではありません。改行やスペースなどを含む任意の名前を処理する必要がある場合は、これ以上の作業が必要になります。

tmp=${TMPDIR:-/tmp}/crlf.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15

find . -type f -print |
while read name
do
    tr -d '\015' < $name > $tmp.1
    mv $tmp.1 $name
done

rm -f $tmp.?
trap 0
exit 0

トラップ機能により、一時ファイルが残されないことが保証されます。一時ファイル名にもっとランダムな名前を付けて、プルできる他のトリックがあります。敵対的な環境で作業しない限り、通常は必要ありません。

于 2012-05-17T03:15:01.877 に答える
2

エディターをバッチ モードで使用することもできます。

find . -type f -exec bash -c 'echo -ne "%s/\\\r//\nx\n" | ex "{}" ' \;
于 2012-05-17T09:04:13.900 に答える
0

\rが続いていない場合\n(おそらく Tim Pote のファイルの場合):

  • 削除\r(を使用tr -d) すると、改行が削除される場合があります
  • で置き換える\r\n、二重/三重の改行が発生しない場合があります

Tim Pote は、彼が言及したファイルについて上記の点を検証できるかもしれません。

于 2012-06-26T22:22:47.453 に答える