単一のコマンドで特定の種類のファイルごとにtar.gzを作成する方法は?

単一のコマンドで特定の種類のファイルごとにtar.gzを作成する方法は?

*.html特定の種類のすべてのファイルをその場所で圧縮して解凍する必要があります。解凍するには、次のコマンドを使用しましたが、私はうまくいきました。

find dir -name "*.html.tar.gz" -exec tar -xvzf {} \;

私は*.htmp.tar.gzそれぞれのディレクトリでそれを見ることができます。

圧縮のために次のコマンドを実行しようとしていますが、findの引数接続が発生しないため機能しません。

find dir -name "*.html" -exec tar -cvzf {}.tar.gz {} \;

ソリューションを提案し、ストレス低減ソリューションが完璧であるかどうかを教えてください。

編集:私が今使っているものはターゲット名を必要としませんが、それがまったく不可能かどうか疑問にgunzip思います。tarしたがって、元の問題を解決する答えを待っています。

fork()編集:要件は、C関数とコマンドを介して実行する必要があるコマンドを持つことです。exec()だから私はパイプラインが可能だとは思わない。

編集:また、圧縮にできるだけ少ない時間がかかるため、効率的な方法を探しています。

ベストアンサー1

find . -name '*.html' -type f -exec sh -c '
   for file do tar czf "$file.tar.gz" "$file"; done' sh {} +

Cで:

execlp("find", "find", ".", "-name", "*.html", "-type", "f", "-exec",
       "sh", "-c", "for file do tar czf \"$file.tar.gz\" \"$file\"; done",
       "sh", "{}", "+", 0);

呼び出し元に失敗またはアーカイブプロセスを報告するには、次のように改善できます。

find . -name '*.html' -type f -exec sh -c '
  ok=true
  for file do
    tar czf "$file.tar.gz" "$file" || ok=false
  done
  "$ok"' sh {} +

-exec cmd {} +場合、findコマンドを実行するために生成されたプロセスがゼロ以外の終了状態に戻ると、ゼロ以外の終了状態で終了します。

おすすめ記事