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?

sulman
fuente
@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/**\*
sulman
fuente
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!

pionero
fuente
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%)
ericn
fuente
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

Gianluca P.
fuente
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/\*
Richard Gomes
fuente
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.

Rick Ehrahrt
fuente
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.

Francisco M
fuente
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