bugfix> linux > 投稿

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

この検索を最適化するためにインターネットで検索したところ、使用できることがわかりました xargsfind の代わりに -exec パフォーマンスを向上させるために、以下のものを変換して使用するのに苦労しています xargs

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

ばかげた質問かもしれませんが、どんな助けでも大歓迎です!

回答 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

  • 実際にははるかに単純です。シェルを起動したり、使用したりする必要はありません mv なぜなら dos2unix あなたがそれを与えない場合、すでにターゲットファイルを変更します -n 国旗。

    find /path_to_files -type f -exec dos2unix -k -q -- {} +
    
    

    -type f そのため、findはディレクトリではなく、通常のファイルのみを検索します。 -q フラグが与えられます dos2unix 情報メッセージをstdoutに書き込まないようにします。そして、私たちは {} + の代わりに {} \; findが1つを呼び出さないように dos2unix 見つかった各ファイルのプロセスではなく、引数としてできる限り多くのファイルを提供します( dos2unix file1 file2 file3 ... )。

    Xargsは1つの追加プロセスであり、したがって1つの追加の時間ペナルティになります。できる限り新しいプロセスを呼び出さないでください。

あなたの答え