循环遍历文件夹并对 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

您需要tar -tf {} \;而不是单独tar -tf {} +运行tar每个 tarball。在 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(比如两个),您的-exec命令将如下所示

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

等等。然而,这将被解释为“看看是否有一个文件/path/2/to/example.tar在 TAR 文件中/path/1/to/example.tar”,显然不应该是这样。

如果你将代码修改为

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

它将tar针对找到的每个文件单独执行该命令。

相关内容