dos2unix
フォルダとそのサブフォルダ内のすべてのファイルに対して実行するようにこのコマンドを適用する方法はありますか?これを簡単に行うための同様のオプションがman dos2unix
表示されませんか-r
?
答え1
find /path -type f -print0 | xargs -0 dos2unix --
答え2
使用bash
:
shopt -s globstar
dos2unix **
シェルglobstar
オプションを使用bash
すると、globsを使用できます**
。これはpathnameと似ています*
が、/
パス名と一致します(したがって、サブディレクトリの名前も同じです)。これは、サブディレクトリに適切な数のファイル(千ではなく)があるディレクトリに適用されます。
zsh
Inとシェルyash
(set -o extended-glob
inを使用yash
)では、次のことを行います。
dos2unix **/*
答え3
私にとっては、バイナリファイルと隠しファイルをスキップすることが重要です。
これは私にとってうまくいきます。
find . -type f -not -path '*/\.*' -exec grep -Il '.' {} \; | xargs -d '\n' -L 1 dos2unix -k
つまり、現在のディレクトリに隠されていないすべてのファイルを再帰的に検索し、grepを使用してバイナリ以外の(-I)空でないすべてのファイルを一覧表示し、一度に1つのファイルをxargs(新しい行で区切る)にパイプします。 。そして元のタイムスタンプを維持してください。
また見なさい:
答え4
dos2unix
複数のプロセスを使用して目的のディレクトリまたはパスで繰り返し実行(または他のコマンド)する方法
この回答は「使用方法xargs
」も暗黙的に扱います。
最高を組み合わせました。この回答、この回答とこの回答私の答えを書くと、あなたのニーズに応じて3つの別々のソリューションがあります。
実行
dos2unix
(または他のコマンド)ディレクトリ全体のすべてのファイル。find . -type f -print0 | xargs -0 -n 50 -P $(nproc) dos2unix
(注:くださいいいえgitリポジトリで上記のコマンドを実行します。そうしないと、ディレクトリの内容が破損し、
.git
最初からディレクトリを再複製する必要があります。 gitディレクトリの場合はdirを除外する必要があります.git
。以下の解決策を参照してください。 )実行
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
実行
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%まで活用することになりました。
説明する:
dos2unix
は私たちが実行するコマンドですxargs
。- in、
-print0
in、およびin allは、「0で区切られた」または「nullで区切られた」ファイルパスのリストを表します。これにより、特殊文字とスペースを含むファイルパスを区切るバイナリゼロを見つけるだけで簡単に区別できます。find
-0
xargs
-z
git ls-files
nproc
コンピュータにあるCPUコアの数を一覧表示します(例:8)。したがって、パスは、-P $(nproc)
コマンドを実行するためにコアがあるだけ多くのプロセスを生成することを意味します(dos2unix
私たちの場合)。このように、私たちは各CPUコアのワーカープロセスを作成してランタイムを最適化しようとしています。xargs
パイプで接続された入力のストリームから個々のコマンドを実行できます。-n 50
合格だと言う50のファイルパスコマンドを実行する各プロセスを作成します(私たちの場合)。これにより、1つまたは2つ、またはいくつかのファイルの代わりに複数のファイルが一度に処理されるため、dos2unix
新しいプロセスの作成によるオーバーヘッドが削減されます。dos2unix
find .
-type f
現在のディレクトリ()でファイル()を見つけます.
。git ls-files
gitリポジトリのすべてのファイルを一覧表示します。--
git ls-files
この関数のオプションがもう存在しないことをパーサーに表示して、渡されたオプションを終了します。これにより、次のすべてのエントリが--
ファイルまたはフォルダパスのリストになることがわかります。
引用:
- 上記の3つの答えです。
- どこで学びましたか
nproc
?コマンドラインからLinuxのCPU /コア数を取得するには? - 私の答えはを使用するときにディレクトリを除外する方法は
find
?
また見なさい:
- テキストファイルで行末を見つける方法は?- 行末のみを表示するには、上記のコマンドで
file
代わりに使用します。dos2unix
現在特定のディレクトリ内のすべてのファイルについて。 - 私の答え:Gitのファイル制限(数とサイズ)は何ですか?
- GitHub:行末を処理するようにGitを構成する
- パラメータの配置を指定するオプションを
xargs
追加する別の例:-I{}
並列操作(プロセスごとに1つのCPUコア、コア数と同じプロセス)を使用して複数のファイルをzipファイルと同じ名前の出力ディレクトリに同時に解凍する方法 - 時にはwithのような正しい交換を得るために
bash -c
withを使用する必要があるかもしれません。ねえ:xargs
dirname
スタックオーバーフロー:findコマンドでdirnameを使用すると、なぜ各一致にスコアが与えられるのですか?xargs
私のリポジトリから.zipファイルを抽出するために、いくつかのコマンドでこのトリックを使用しました。https://github.com/ElectricRCAaircraftGuy/FatFs。これらのコマンドについては、Readmeファイルを参照してくださいxargs
。