-findコマンドで-execをxargsに変換する

-findコマンドで-execをxargsに変換する

dos2unixWindowsからLinuxにコピーされたファイルに対して操作を実行するために、スクリプトは次のコマンドを使用しています。ファイル数が多いため、この操作にはかなり時間がかかります。

これを最適化するためにインターネットを検索した結果、xargswithを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使用します。{} +{} \;dos2unixdos2unix 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

関連情報