一般「一部を読みながら」を「並列」に変換/交換

一般「一部を読みながら」を「並列」に変換/交換

これを行う多くのスクリプトがあります。

command | while read something; do
    a
    long
    list
    of
    commands
done

を使用してパイプされたすべてのコマンドを実行する方法を理解した人はいますかparallel?持つアドホックこの問題に対する解決策がありますが、何かを探しています。一般的なparallelスクリプトへの最小限の変更のみが必要で、可能であればインストールされていない場合でも実行できます。

command上記の命令は単一の命令に限定されず、ほぼすべてのものであってもよい。a long list of commandsそれとも完全に異なる場合があります。

たとえば、gitリポジトリでチェックアウトされたファイルの変更日を最後の変更日に変更する次の行を考えてみましょう。

git ls-tree -r --name-only HEAD | 
while read filename; do
   unixtime=$(git log -1 --format="%at" -- "${filename}");
   touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S');
   touch -t ${touchtime} "${filename}";
done

git logデフォルトでは、とはすべて非常に遅いコマンドなので、非常に遅いですtouch。しかし、これは単なる例であり、単純な例です。

ベストアンサー1

私はbash関数を使用してそれを呼び出します:

myfunc() {
   filename="$1"
   unixtime=$(git log -1 --format="%at" -- "${filename}");
   touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S');
   touch -t ${touchtime} "${filename}";
}
export -f myfunc

git ls-tree -r --name-only HEAD | parallel myfunc

parallel -0NULに分割するには。

GNU Parallelをインストールせずに上記のコードを実行するには、次のものを使用できます。

parallel --embed > myscript.sh

次に、上記の内容をmyscript.sh

おすすめ記事