dos2unix
WindowsからLinuxにコピーされたファイルに対して操作を実行するために、スクリプトは次のコマンドを使用しています。ファイル数が多いため、この操作にはかなり時間がかかります。
これを最適化するためにインターネットを検索した結果、xargs
withをfind
代わりに使用して-exec
パフォーマンスを向上させることができることがわかりましたが、次のものをwithに使用するように変換するのが困難ですxargs
。
find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;
答え1
実際にははるかに簡単です。フラグを指定しないと、オブジェクトファイルはすでに変更されているmv
ため、シェルを呼び出すか使用する必要はありません。dos2unix
-n
find /path_to_files -type f -exec dos2unix -k -q -- {} +
-type f
このように、findはディレクトリではなく通常のファイルのみを検索します。標準出力に情報メッセージを書き込まないように-q
フラグを付けます。代わりに、見つかった各ファイルに対してプロセスを呼び出さずに引数()と同じ数のファイルを提供するためにfindをdos2unix
使用します。{} +
{} \;
dos2unix
dos2unix file1 file2 file3 ...
Xargsは追加プロセスにすぎないため、追加の時間ペナルティが発生します。可能であれば、新しいプロセスを呼び出さないでください。
答え2
~/bin
ファイルの一覧を処理するスクリプトを作成し、名前を次のようにしますdoit
。
#!/bin/bash
while [[ $# -ne 0 ]] ; do
thisfile="$1"
shift
dos2unix -k -n "$thisfile" tmp_file
mv tmp_file "$thisfile"
done
次に、
chmod +x ~/bin/doit
ついに、
find /path/to/files -type f -print0 | \
xargs -0 -r $HOME/bin/doit
読むman find xargs bash
。