Directorio zip de Unix pero excluyó subdirectorios específicos (y todo lo que contenga)


110

Estoy tratando de comprimir un directorio (en Unix a través de SSH) pero necesito excluir un par de subdirectorios (y todos los archivos y directorios dentro de ellos).

Hasta ahora tengo esto:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Sin embargo, eso no parece funcionar.

También intenté

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

Sin embargo, eso todavía incluirá subdirectorios dentro de ignoreDir1 e ignoreDir2.

La estructura del subdirectorio en los directorios que quiero excluir es bastante sustancial, por lo que no puedo simplemente agregar cada directorio al argumento -x.

¿Alguien sabe como hacer esto?


@AlexanderMills - Ver esta pregunta.
— jww

Respuestas:


126

¡Yo estaba tan cerca!

El comando real que necesito es:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

Genial, y gracias por seguir! Puede aceptar su propia respuesta, por cierto.
— Daniel H

2
Esto no funcionó para mí en osx. Sin embargo, la respuesta de @pathfilder sí.
— rynop

11
En lugar de esto: -x dir1 / ignoreDir1 / ** \ *, puede hacer esto: -x dir1 / ignoreDir1 / \ *
— Richard Gomes

65

Para mi sistema particular para excluir un directorio, tuve que poner comillas alrededor de mis directorios excluidos y funcionó de maravilla:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Notas:

- esto excluyó tanto el directorio para excluir como todos los archivos dentro de él.

- ¡Debe usar la ruta completa a los directorios que desea excluir!


55
Este es el que funciona en Mac OS. :-)
— physicalattraction

99
Como nadie ha explicado la razón por la que se requiere citar las rutas o escapar del asterisco, la razón es esta: si la ruta no se cita o se escapó el comodín, el shell realizará la expansión del comodín antes de pasarlos zip, lo que recibirá una lista de rutas a entradas en los directorios especificados, pero no rutas a archivos dentro de subdirectorios de esas, lo que hace zipque no ignore todo lo que se encuentra debajo de los directorios dados.
— zagrimsan

Creo que originalmente una de las razones por las que esto funcionó fue porque en Mac OS había espacios en mis directorios y esto evitaba necesitar un \
— pathfinder el

Gracias por aclarar las cosas @zagrimsan. Eso solucionó el problema y explicó la razón para que lo entendamos (lo que también será útil en el futuro para otras cosas). 👍
— Synetech

7

Lo siguiente hará

zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 \ * dir1 / ignoreDir2 \ *

¿Para qué necesitabas **, @sulman?

Funciona como un encanto para mí de la siguiente manera:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

No sé por qué se necesita el **. ¿Quizás alguien más pueda arrojar algo de luz sobre esto?
— sulman

Lo siento @sulman, escribí mal. Lo que quise decir es según mi última edición. Funciona como un encanto para mí :)
— ericn

7

@sulman usando:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 / ** \ * dir1 / ignoreDir2 / ** \ *

aún incluirá dir1 / ignoreDir1 / carpeta vacía en el archivo zip, usando:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 ** dir1 / ignoreDir2 **

hará el truco, también puede usar un ** inicial para buscar en subcarpetas en lugar de solo dir1


Ah ok! Gracias por arrojar la luz sobre esto!
— sulman

1

Al igual que otras respuestas, pero excluyendo directorios por completo, en lugar de excluir todo el contenido de los directorios:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*

0

Encontré esto para trabajar de David R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Excluyó el directorio y sus contenidos.


Seguramente la barra invertida entre dir1y ignorDir2está destinada a ser una barra diagonal. ¿Quieres decir que las otras barras invertidas son barras invertidas? Si lo hace, entonces acaba de copiar la respuesta de fuzzybee de hace dos años.
— G-Man

-1

Para mí trabajó: zip -9 -r ~ / folded.zip en línea -x carpeta / carpeta2 / carpeta3 / carpetan / \ * .

Parece ser que se debe escapar el asterisco.


2
¿Cómo difiere esto de la solución de Rick Ehrahrt hace un año o de Eric (hace unos años más)? Lea las soluciones proporcionadas antes de publicar una nueva ...
— zagrimsan

Porque agregué una barra diagonal inversa antes del asterisco (es decir, para escapar del asterisco). En la versión de Linux en mi trabajo no funciona si no hago eso.
— Francisco M

También Rick Ehrahrt (2014) y Eric (2012) publicaron la misma solución (para escapar del asterisco). No hay nada de malo en la solución, pero publicar la misma varias veces no tiene sentido a menos que uno pueda agregar significativamente profundidad a la solución al explicar por qué funciona. En un caso simple como este, no hay nada más que explicar. No tome esto personalmente, mi única intención aquí es ayudar a mantener SU limpio y conciso para que los usuarios puedan encontrar la mejor solución con el menor esfuerzo.
— zagrimsan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.