フォルダーを調べて、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 1
example.tar
example.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
問題は、の演算+
に 演算子を使用していることにあると思います。演算子は、「 の結果をスペースで区切られたリストに連結し、そのリストを引数として指定されたコマンドを実行する」ことを意味します。-exec
find
+
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
見つかったファイルごとにコマンドを個別に実行します。