フォルダをループしてTAR内のファイルを数える

フォルダをループしてTAR内のファイルを数える

フォルダーを調べて、TAR 内の同じ名前のファイルを数える必要があります。

私はこれを試しました:

find -name example.tar -exec tar -tf {} + | wc -l

しかし、それは失敗します:

tar: ./rajce/rajce/example.tar: Not found in archive
tar: Exiting with failure status due to previous errors
0

example.tar が 1 つだけの場合でも動作します。

ファイルごとに別々の番号が必要です。

ありがとう!

答え1

tar -tf {} \;代わりに、各 tarball を個別にtar -tf {} +実行する必要がありますtar。GNU では次のman findように書かれています:

   -exec command {} +

          This variant of the -exec action runs the specified
          command on the selected files, but the command line is
          built by appending each selected file name at the end;
          the total number of invocations of the command will be
          much less than the number of matched files.  The command
          line is built in much the same way that xargs builds its
          command lines.  Only one instance of `{}' is allowed
          within the com- mand.  The command is executed in the
          starting directory.

コマンドは と同等ですtar tf example.tar example.tar。引数も不足しています[path...]。 の実装によっては find、たとえば BSD find ではfind: illegal option -- n エラーが返されます。全体としては、次のようになります。

find . -name example.tar -exec tar -tf {} \; | wc -l

この場合、見つかったすべてのファイルwc -l内のファイルの数をカウントする ことに注意してください。を使用して、現在のディレクトリ内のファイルのみを検索 できます。すべてのファイルを再帰的に検索し、各ファイルを個別に印刷したい場合は(ここにはexample.tar-maxdepth 1example.tarexample.tar$コマンドラインプロンプト コマンドの一部ではなく、新しい行の開始を示すために使用されます):

$ find . -name example.tar -exec sh -c 'tar -tf "$1" | wc -l' sh {} \;
3
3

ディレクトリ名を先頭に追加します:

$ find . -name example.tar -exec sh -c 'printf "%s: " "$1" && tar -tf "$1" | wc -l' sh {} \;
./example.tar: 3
./other/example.tar: 3

答え2

問題は、の演算+に 演算子を使用していることにあると思います。演算子は、「 の結果をスペースで区切られたリストに連結し、そのリストを引数として指定されたコマンドを実行する」ことを意味します。-execfind+find

つまり、example.tar異なるパスに複数のファイル(たとえば2つ)がある場合、-execコマンドは次のようになります。

tar -tf /path/1/to/example.tar /path/2/to/example.tar

ただし、これは「ファイルがあるかどうかを調べる」と解釈されます/path/2/to/example.tarTARファイル内/path/1/to/example.tar」ですが、明らかにそうではありません。

コードを次のように変更すれば問題ないはずです。

find -name example.tar -exec tar -tf {} \; | wc -l

tar見つかったファイルごとにコマンドを個別に実行します。

関連情報