2017-08-23 20 views
2

このトピックに関するいくつかの質問がありましたが、これを私の特定の問題に変換する機能がありません。私は、サブディレクトリをループし、各ディレクトリ内の圧縮されたテキストファイルで.shスクリプトを実行するforループを持っています。私はこのプロセスを並列化したいが、私はgnuを並列に適用するのに苦労している。ここでforループを並列化するためにgnuを並列化する

は私のループです:

for d in ./*/ ; do (cd "$d" && script.sh); done 

私は、並列に入力するリストを必要と理解しているので、私はこれをしようとしている:

ls -d */ | parallel cd && script.sh 

これが始めるように見えるが、私が手gzipがディレクトリ内のtxtファイルの1つを解凍しようとしたときにエラーが発生し、ファイルが存在しない旨を示します。

しかし、私はループのためのオリジナルを実行すると、私は終わりに世紀を取ってそれ以外の問題はありません。また、パラレルを使用するときにgzipエラーが発生するのは1回だけです。これは1000個以上のサブディレクトリがあることを考えると奇妙です。

私の質問は以下のとおりです。

  1. がどのように私は私の場合、仕事に平行なのですか? .shスクリプトのアプリケーションを、それ自身のサブディレクトリにある1000個のファイルに並列化するにはどうすればよいですか?つまり、私の問題の解決策は何ですか?私は進歩しなければならない。

  2. 何が欠けていますか?構文、ループ、悪いスクリプト?私は学びたい。

  3. Parallelは実際にこれらのすべての.shスクリプトを並行して実行しようとしていますか?すべての.txt.gzファイルでエラーが表示されないのはなぜですか?

  4. アプリケーションに最適なオプションは並行ですか?私のニーズに適した別のオプションがありますか?

答えて

4

2つの問題:で

  1. ls -d */ | parallel cd && script.sh 
    

    並列接続されているものだけでcd、ないscript.shです。 script.shは、エラーがなければ、すべてのparallel cdジョブが実行された後に1回だけ実行されます。あなたがcdにターゲットディレクトリを渡さない

    ls -d */ | parallel cd 
    if [ $? -eq 0 ]; then script.sh; fi 
    
  2. :それは同じです。したがって、parallelによって実行されるのはちょうどcdであり、現在のディレクトリをホームディレクトリに変更するだけです。最後のscript.shは、おそらく*.txt.gzファイルが存在しないので、エラーが発生した現在のディレクトリ(コマンドを呼び出した場所)で実行されます。

あなたは自分自身にとの最初の問題の影響をチェックすることができます

$ mkdir /tmp/foobar && cd /tmp/foobar && mkdir a b c 
$ ls -d */ | parallel cd && pwd 
/tmp/foobar 

pwdの出力は、複数の入力ディレクトリを持っている場合でも、一度だけ印刷されています。あなたは、コマンドを引用して、それを修正し、次いで第二の問題を確認することができます。

$ ls -d */ | parallel 'cd && pwd' 
/homes/myself 
/homes/myself 
/homes/myself 

が入力ディレクトリがあるが、それは常に同じ出力であるとして、あなたはできるだけ多くpwd出力が表示されます。あなたのホームディレクトリ。 2番目の問題は、現在の入力で置換された置換文字列{}を使用して解決できます。次のように確認してください:

ここで、出力にすべての入力ディレクトリを適切に表示する必要があります。あなたの特定の問題については

これは動作するはずです:

ls -d */ | parallel 'cd {} && script.sh' 
+0

素敵な説明を! –

関連する問題