filtro en "buscar" ignorado cuando la salida se envía a tar

filtro en "buscar" ignorado cuando la salida se envía a tar

Tengo la siguiente estructura de directorios:

test/
test/1/
test/foo2bar/
test/3/

Quiero comprimir el directorio "prueba" excluyendo todo lo que está en subdirectorios (profundidad no predefinida), que incluyen cadenas "1" o "2" en ellos. En bash shell, quiero usarencontrary alimentar su salida aalquitrán. primero prueboencontrar:

find test/ -not -path "*1*" -not -path "*2*"

Producción:

test/
test/3

Excelente. Entonces lo combino conalquitrán:

find test/ -not -path "*1*" -not -path "*2*" | tar -czvf test.tar.gz --files-from -

Producción:

test/
test/3/
test/1/
test/foo2bar/
test/3/

De hecho, tanto "test/1" como "test/foo2bar" ​​están presentes en el archivo.¿Por qué se pasaron estos argumentos a tar, si se suponía que no estaban presentes en la salida de búsqueda?

Respuesta1

Para ampliar lo que dijo @cuonglm, tarde forma predeterminada funciona de forma recursiva. Si le pasa un nombre de directorio, archivará elcontenidode ese directorio.

Podrías modificar tu findcomando para devolver solo los nombres de los archivos, no los directorios...

find test/ -type f -not -path "*1*" -not -path "*2*" |
tar -czvf test.tar.gz --files-from -

En su lugar, podrías usar la --no-recursionbandera para tar:

find test/ -not -path "*1*" -not -path "*2*" | 
tar -czvf test.tar.gz --no-recursion --files-from - 

Lo que resulta en:

test/
test/3/

La --no-recursionbandera es específica de GNU tar. Si está utilizando otra cosa, consulte la página de manual correspondiente para ver si hay una función similar disponible.

Tenga en cuenta que su findcomando excluiráarchivosque contienen 1o 2en la ruta, así como directorios.

Respuesta2

Con GNU tar, también puedes usar la --excludeopción para excluir archivos según los nombres.

$ tar --exclude "*1*" --exclude "*2*" -cvf foo.tar  test/
test/
test/3/

También hay -Xo --exclude-fromque toma un archivo desde el cual leer los patrones de exclusión.


Aunque como find -not -path "*1*", esto también excluirá archivos cuyos nombres contengan 1o 2. solo para saltardirectorioscuyos nombres coinciden con el patrón, uso find -pruney tar --no-recursion:

$ touch test/3/blah.1
$ find test/ -type d \( -name "*1*" -o -name "*2*" \) -prune -o -print |
   tar cvf test.tar --files-from - --no-recursion
test/
test/3/
test/3/blah.1

(Al menos GNU tar y FreeBSD tar tienen --no-recursion)

información relacionada