
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, tar
de forma predeterminada funciona de forma recursiva. Si le pasa un nombre de directorio, archivará elcontenidode ese directorio.
Podrías modificar tu find
comando 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-recursion
bandera 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-recursion
bandera 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 find
comando excluiráarchivosque contienen 1
o 2
en la ruta, así como directorios.
Respuesta2
Con GNU tar, también puedes usar la --exclude
opción para excluir archivos según los nombres.
$ tar --exclude "*1*" --exclude "*2*" -cvf foo.tar test/
test/
test/3/
También hay -X
o --exclude-from
que 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 1
o 2
. solo para saltardirectorioscuyos nombres coinciden con el patrón, uso find -prune
y 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
)