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 tar
cada tarball individualmente. En GNU man find
dice:
-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 -l
se contará la cantidad de archivos en todos
example.tar
los archivos encontrados. Puede utilizar -maxdepth 1
para buscar
example.tar
archivos solo en el directorio actual. Si desea buscar todos example.tar
de 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 -exec
funcionamiento de find
. El +
operador significa "Concatenar los resultados find
en 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 -exec
comando 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 tar
comando por separado para cada archivo encontrado.