フォルダのすべての内容にdos2unixを再帰的に適用するには?

フォルダのすべての内容にdos2unixを再帰的に適用するには?

dos2unixフォルダとそのサブフォルダ内のすべてのファイルに対して実行するようにこのコマンドを適用する方法はありますか?これを簡単に行うための同様のオプションがman dos2unix表示されませんか-r

答え1

find /path -type f -print0 | xargs -0 dos2unix --

答え2

使用bash:

shopt -s globstar
dos2unix **

シェルglobstarオプションを使用bashすると、globsを使用できます**。これはpathnameと似ています*が、/パス名と一致します(したがって、サブディレクトリの名前も同じです)。これは、サブディレクトリに適切な数のファイル(千ではなく)があるディレクトリに適用されます。

zshInとシェルyashset -o extended-globinを使用yash)では、次のことを行います。

dos2unix **/*

答え3

私にとっては、バイナリファイルと隠しファイルをスキップすることが重要です。

これは私にとってうまくいきます。

find . -type f -not -path '*/\.*' -exec grep -Il '.' {} \; | xargs -d '\n' -L 1 dos2unix -k

つまり、現在のディレクトリに隠されていないすべてのファイルを再帰的に検索し、grepを使用してバイナリ以外の(-I)空でないすべてのファイルを一覧表示し、一度に1つのファイルをxargs(新しい行で区切る)にパイプします。 。そして元のタイムスタンプを維持してください。

また見なさい:

https://github.com/mdolidon/endlines

答え4

dos2unix複数のプロセスを使用して目的のディレクトリまたはパスで繰り返し実行(または他のコマンド)する方法

この回答は「使用方法xargs」も暗黙的に扱います。

最高を組み合わせました。この回答この回答この回答私の答えを書くと、あなたのニーズに応じて3つの別々のソリューションがあります。

  1. 実行dos2unix(または他のコマンド)ディレクトリ全体のすべてのファイル。

    find . -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
    

    (注:くださいいいえgitリポジトリで上記のコマンドを実行します。そうしないと、ディレクトリの内容が破損し、.git最初からディレクトリを再複製する必要があります。 gitディレクトリの場合はdirを除外する必要があります.git。以下の解決策を参照してください。 )

  2. 実行dos2unix(または他のコマンド)完全なGitリポジトリ内のすべてのファイルまたはすべてのチェックインファイル:

    # A) Use `git ls-files` to find just the files *checked-in* to the repo.
    git ls-files -z | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find`, to find all files in this dir, period, but exclude the
    # `.git` dir so we don't damage the repo. 
    # - See my answer on excluding directories using `find`:
    #   https://stackoverflow.com/a/69830768/4561887
    find . -not \( -path "./.git" -type d -prune \) -type f -print0 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    
  3. 実行dos2unix(または他のコマンド)指定されたディレクトリ内のすべてのファイル、またはgitリポジトリのすべてのチェックインファイル:

    # 1. only in this one directory: "path/to/dir1":
    
    # A) Use `git ls-files` to find just the files checked-in to the repo.
    git ls-files -z -- path/to/dir1 | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find` to find all files in this repo dir, period.
    find path/to/dir1 -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
    
    
    # 2. in all 3 of these directories:
    
    # A) Use `git ls-files` to find just the files checked-in to the repo.
    git ls-files -z -- path/to/dir1 path/to/dir2 path/to/dir3 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    
    # Or B): use `find` to find all files in these 3 repo dirs, period. Note
    # that by specifying specific folders you are automatically excluding the
    # `.git` dir, which is what you need to do.
    find path/to/dir1 path/to/dir2 path/to/dir3 -type f -print0 \
        | xargs -0 -n 50 -P $(nproc) dos2unix
    

スピード:

残念ながら、私はそれを実行するのにかかった時間を記録しませんでしたが、git ls-files -z | xargs -0 -n 50 -P $(nproc) dos2unix上記のコマンドが大まかに変換されたことを知っています。私の巨大なGitリポジトリには150万のファイルがあります。3分で。上記で使用したマルチプロセスコマンドが役に立ちました。トーンその結果、全体のプロセス中に、マイコンピュータの全体CPU処理能力(20コアで構成)を最大90%まで活用することになりました。

説明する:

  1. dos2unixは私たちが実行するコマンドですxargs
  2. in、-print0in、およびin allは、「0で区切られた」または「nullで区切られた」ファイルパスのリストを表します。これにより、特殊文字とスペースを含むファイルパスを区切るバイナリゼロを見つけるだけで簡単に区別できます。find-0xargs-zgit ls-files
  3. nprocコンピュータにあるCPUコアの数を一覧表示します(例:8)。したがって、パスは、-P $(nproc)コマンドを実行するためにコアがあるだけ多くのプロセスを生成することを意味します(dos2unix私たちの場合)。このように、私たちは各CPUコアのワーカープロセスを作成してランタイムを最適化しようとしています。
  4. xargsパイプで接続された入力のストリームから個々のコマンドを実行できます。
  5. -n 50合格だと言う50のファイルパスコマンドを実行する各プロセスを作成します(私たちの場合)。これにより、1つまたは2つ、またはいくつかのファイルの代わりに複数のファイルが一度に処理されるため、dos2unix新しいプロセスの作成によるオーバーヘッドが削減されます。dos2unix
  6. find .-type f現在のディレクトリ()でファイル()を見つけます.
  7. git ls-filesgitリポジトリのすべてのファイルを一覧表示します。
    1. --git ls-filesこの関数のオプションがもう存在しないことをパーサーに表示して、渡されたオプションを終了します。これにより、次のすべてのエントリが--ファイルまたはフォルダパスのリストになることがわかります。

引用:

  1. 上記の3つの答えです。
  2. どこで学びましたかnprocコマンドラインからLinuxのCPU /コア数を取得するには?
  3. 私の答えはを使用するときにディレクトリを除外する方法はfind

また見なさい:

  1. テキストファイルで行末を見つける方法は?- 行末のみを表示するには、上記のコマンドでfile代わりに使用します。dos2unix現在特定のディレクトリ内のすべてのファイルについて。
  2. 私の答え:Gitのファイル制限(数とサイズ)は何ですか?
  3. GitHub:行末を処理するようにGitを構成する
  4. パラメータの配置を指定するオプションをxargs追加する別の例:-I{}並列操作(プロセスごとに1つのCPUコア、コア数と同じプロセス)を使用して複数のファイルをzipファイルと同じ名前の出力ディレクトリに同時に解凍する方法
  5. 時にはwithのような正しい交換を得るためにbash -cwithを使用する必要があるかもしれません。ねえ:xargsdirnameスタックオーバーフロー:findコマンドでdirnameを使用すると、なぜ各一致にスコアが与えられるのですか?
    1. xargs私のリポジトリから.zipファイルを抽出するために、いくつかのコマンドでこのトリックを使用しました。https://github.com/ElectricRCAaircraftGuy/FatFs。これらのコマンドについては、Readmeファイルを参照してくださいxargs

関連情報