2012-07-18 23 views
9

Tengo el siguiente que quiero hacer:
find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar cvf somefile.tar --files-from=-
es decir, excluyen a una gran cantidad de cosas, solo se ve a 6 subdirectorios profundidad, y luego una vez se realiza la poda, el alquitrán el resto.encontrar con xargs y alquitrán

No es difícil. El bit antes de la tubería (|) funciona al 100%. Si excluyo el tar, entonces obtengo lo que busco (a la pantalla). Pero una vez que incluyo la tubería y el alquitrán, lo ataca todo, incluso todo lo que acabo de excluir en el hallazgo.

He intentado una serie de iteraciones diferentes:
-print0 | xargs -0 tar rvf somefile.tar
-print0 | xargs -0 tar rvf somefile.tar --null --files-from = -
-print0 | tar cvf somefile.tar --null -T -

Entonces, ¿qué estoy haciendo mal? He hecho esto antes; pero ahora solo me está dando cabellos grises.

+0

Creo que necesita comillas alrededor de la '* .tar.gz' Para evitar que conseguir expandido en' bash' antes de pasar a 'find' – drevicko

Respuesta

5

Recuerdo hacer algo como debajo de la línea para agrupar un montón de archivos. Estaba específica sobre los archivos Quiero grupo, por lo que me encontré algo como esto

find . -name "*.xyz" | xargs tar cvf xyz.tar; 

En su caso, me pregunto por qué está haciendo "-o" antes de la -print que parece estar incluyendo todo de nuevo

+4

me corrija si estoy Estoy equivocado, pero creo que si tiene muchos archivos generados por 'find',' xargs' ejecutará 'tar' varias veces con subconjuntos de la lista de archivos. Desafortunadamente, el '-c' luego sobrescribe los archivos tar anteriores y solo obtiene el último lote en su archivo tar final. – drevicko

+0

Puedes probarlo. Conseguí con éxito un archivo tar de 7-8 archivos que busqué utilizando find. Lo que sucede aquí es, Find devuelve resultados y xargs los alimenta al tar generando un solo archivo tar – rajshenoy

+2

@jajshenoy 7-8 archivos probablemente no sea suficiente para descubrir este problema. Eche un vistazo a la sección 'Longitud máxima de comando' en [esta página] (http: // offbytwo.com/2011/06/26/things-you-didnt-know-about-xargs.html). Prueba 'echo | xargs --show-limits' para ver el tamaño de la línea de comando que está usando xargs, para mí es 131072. Eso es bastante grande, pero si tienes unos pocos miles de archivos, ¡se agota rápidamente! – drevicko

3

Si su búsqueda devuelve directorios, estos se pasarán a tar, y se incluirán los contenidos completos, independientemente de las exclusiones en su comando de búsqueda.

Por lo tanto, creo que debe incluir un "tipo de f" en el hallazgo.

13

Lo que funcionó para mí es una combinación del distintivo -print para find, y luego -files-from en el comando tar. En mi caso necesito subir a más de 5000 archivos de registro, pero el solo usar xargs solo me dio 500 archivos en el archivo resultante.

find . -name "*.pdf" -print | tar -czf pdfs.tar.gz --files-from - 

Usted tiene "--files-from = -", cuando lo que desea "--files-de -" y entonces piensa que necesita un - delante de CVF, como la siguiente.

find . -maxdepth 6 (-name *.tar.gz -o -name bediskmodel -o -name src -o -name ciao -o -name heasoft -o -name firefly -o -name starlink -o -name Chandra) -prune -o -print| tar -cvf somefile.tar.gz --files-from - 
+2

Esta es la solución correcta porque usar '--files-from -' evita el problema con los límites de xargs (claro en los comentarios en el ejemplo de @rajshenoy) que da como resultado archivos incompletos. –

0

que utilizan una combinación de los dos enfoques anteriores - una copia de seguridad un día de trabajo hago esto: rm-rf new.tgz; encontrar . -type f -mtime 0 | xargs tar cvf new.tgz;

0

Usar archivos sin una opción fue el único que me hizo funcionar. Todas las otras opciones incluyeron todos los archivos en el directorio en lugar de mi lista generada.

Esta fue mi solución:

find . ! -name '*.gz' -print | xargs tar cvzf ../logs.tar.gz --files-from 
Cuestiones relacionadas