私のシステムのすべてのtarアーカイブを理解するために 'find'と-exec 'tar'をどのように使用しますか?

私のシステムのすべてのtarアーカイブを理解するために 'find'と-exec 'tar'をどのように使用しますか?

私がしようとするコマンドは( "butterflyinmotion.com"をディレクトリとして使用してtarを見つけようとしているので):

find / -name "*.tar.gz" -exec tar -tzf {} \; | grep -W butterflyinmotion

これは多くのエラーを表示し、動作しません。 grep -W は Butterflyinmotion.com がどのファイルにバックアップされているかを知るために必要です。ありがとうございます!

答え1

小さなスクリプトを作成して使用していると思いますfind -exec

たとえば、

#!/bin/sh
エコ >>> $1”
タールtvf"$1"

-exec ./script.sh "{}" \; を使用して呼び出し、結果をファイルにリダイレクトし、そのファイルを grep します。egrep '>>>|WhatYouLookFor' file

スクリプトでgrepを使用することもできます。

#!/bin/sh
エコ >>> $1”
tar tvf "$1" grep '何を探していますか?'

またはより柔軟に:

#!/bin/sh
エコ >>> $2”
tar tvf "$2" 検索 "$1" |

-exec ./script.sh 'WhatYouLookFor' "{}" \; を使用して呼び出します。

答え2

少なくともGNU grepを使用すると、次のことができます。

find / -name '*.tar.gz' -exec sh -c '
  for t; do 
    tar -tvf "$t" | grep -m1 -l --label="$t" "butterflyinmotion"
  done
' {} + 2>/dev/null

.tar.gzこれにより、アーカイブにパターンと一致する1つ以上のファイルを含むファイル名が出力されます。butterflyinmotion


GNU tarを使用すると(少なくとも単純モードでは)grepを省略し、tar -tfexの終了状態を直接使用することが可能になります。

find / -name '*.tar.gz' -exec tar --wildcards -tf {} '*butterflyinmotion' \; -print 2>/dev/null

上記のコマンドは、一致するファイル(存在する場合)とそのあとにアーカイブ名を印刷します。

関連情報