1

質問:

多くのtarファイルが含まれているtarfileを解凍し、すべてのtarファイルのファイルを削除したいのですが、これらすべてのプロセスをUnixbashスクリプトで並行して実行したいと思います。

条件:

  1. untar / removeプロセスにエラーがある場合、スクリプトはエラーを返す必要があります。
  2. すべてのN(untarおよびremove)プロセスが正常に完了した後にのみ、成功を返す必要があります。

提案された解決策:

 mkdir a
 tar -C a -xvf b.tar
 cd a
 for i in *
 do
 rm -r $i &
 done
4

3 に答える 3

3

GNU Parallel http://www.gnu.org/software/parallel/がインストールされている場合は、次の操作を実行できます。

tar xvf foo.tgz | perl -ne 'print $l;$l=$_;END{print $l}' | parallel rm

完全なtar.gzファイルを抽出するスペースがない場合に便利ですが、ファイルを解凍するときにファイルを処理する必要があります。

tar xvf foo.tgz | perl -ne 'print $l;$l=$_;END{print $l}' | parallel do_stuff {}\; rm {}

GNU Parallelは、次の方法で簡単にインストールできます。

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

詳細については、GNU Parallelの紹介ビデオをご覧ください: https ://www.youtube.com/playlist?list = PL284C9FF2488BC6D1

于 2012-05-09T21:59:17.663 に答える
1
mkdir a
tar -C a -xvf b.tar
 cd a
 success=$(for i in *
 do
 rm -r $i || echo failed & # if a job fails false will be echoed
 done
 wait)
 # if any of the jobs failed, success will be set to a value other than ""
 [[ -z "$success" ]] && exit 0 || exit 1
于 2012-05-03T21:08:19.960 に答える
1

答えは、 BurtonSamogradのコメントtar xvf a.tar | tac | xargs -P 4 rm -rvから着想を得ています。xargs -P

$ mkdir -p a/b/c/d
mkdir: created directory `a'
mkdir: created directory `a/b'
mkdir: created directory `a/b/c'
mkdir: created directory `a/b/c/d'

$ touch a/1 a/2 a/3 a/b/4 a/b/5

$ tar cf a.tar a

$ rm -rfv a
removed directory: `a/b/c/d'
removed directory: `a/b/c'
removed `a/b/4'
removed `a/b/5'
removed directory: `a/b'
removed `a/3'
removed `a/1'
removed `a/2'
removed directory: `a'

$ tar xvf a.tar | tac | xargs -P 4 rm -rv
removed `a/2'
removed `a/1'
removed `a/3'
removed `a/b/5'
removed `a/b/4'
removed directory: `a/b/c/d'
removed directory: `a/b/c'
removed directory: `a/b'
removed directory: `a'
于 2013-09-12T12:55:58.317 に答える