Recorre carpetas y cuenta archivos en TAR

Recorre carpetas y cuenta archivos en TAR

Necesito revisar carpetas y contar archivos en TAR con el mismo nombre.

Probé esto:

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

Pero falla:

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

Funciona cuando solo hay un ejemplo.tar.

Necesito un número separado para cada archivo.

¡Gracias!

Respuesta1

tar -tf {} \;En lugar de hacerlo, necesita tar -tf {} +ejecutar tarcada tarball individualmente. En GNU man finddice:

   -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.

Su comando es equivalente a tar tf example.tar example.tar. También le falta [path...]un argumento: algunas implementaciones de find, por ejemplo BSD find, devolverán find: illegal option -- n un error. En total debería ser:

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

Y observe que en ese caso wc -lse contará la cantidad de archivos en todos example.tarlos archivos encontrados. Puede utilizar -maxdepth 1para buscar example.tararchivos solo en el directorio actual. Si desea buscar todos example.tarde forma recursiva e imprimir los resultados para cada uno individualmente (tenga en cuenta que $aquí hay unsímbolo de línea de comando se usa para indicar el inicio de una nueva línea, no es parte del comando):

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

y con los nombres de directorio antepuestos:

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

Respuesta2

Creo que tu problema radica en el uso del +operador para el -execfuncionamiento de find. El +operador significa "Concatenar los resultados finden una lista separada por espacios y ejecutar el comando especificado con esa lista como argumento".

Eso significa que si hay más de un archivo example.tar(digamos, dos) en diferentes rutas, su -execcomando se verá así

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

etc. Eso, sin embargo, se interpretará como "mirar si hay un archivo/ruta/2/a/ejemplo.taren el archivo TAR/ruta/1/a/ejemplo.tar", lo que obviamente no debería ser el caso.

Deberías estar bien si modificas tu código como

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

que ejecutará el tarcomando por separado para cada archivo encontrado.

información relacionada