Comando Shell al directorio tar excluyendo ciertos archivos / carpetas

812

¿Existe un comando / script de shell simple que permita excluir ciertos archivos / carpetas del archivo?

Tengo un directorio que necesita ser archivado con un subdirectorio que tiene una cantidad de archivos muy grandes que no necesito respaldar.

No del todo soluciones:

El tar --exclude=PATTERNcomando coincide con el patrón dado y excluye esos archivos, pero necesito que se ignoren archivos y carpetas específicos (ruta de archivo completa), de lo contrario, podrían excluirse los archivos válidos.

También podría usar el comando find para crear una lista de archivos y excluir los que no quiero archivar y pasar la lista a tar, pero eso solo funciona con una pequeña cantidad de archivos. Tengo decenas de miles.

Estoy empezando a pensar que la única solución es crear un archivo con una lista de archivos / carpetas que se excluirán, luego usar rsync con --exclude-from=filepara copiar todos los archivos a un directorio tmp, y luego usar tar para archivar ese directorio.

¿Alguien puede pensar en una solución mejor / más eficiente?

EDITAR: la solución de Charles Ma funciona bien. El gran problema es que --exclude='./folder' DEBEN estar al comienzo del comando tar. Comando completo (primero cd, por lo que la copia de seguridad es relativa a ese directorio):

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
pozo profundo
fuente
121
Otra cosa que me llamó la atención es que vale la pena una nota: las barras diagonales al final de las carpetas excluidas harán que tar no excluya esas carpetas en absoluto.
Rekhyt
77
@Rekhyt gracias, estuve mirando el comando durante 15 minutos ... luego 30
earcam
99
Parece que la posición de --exclude depende de la versión de tar. Para tar 1.23, --exclude debe venir después de los comandos principales.
Joel G Mathew
2
No olvides el "'" (comillas).
Meetai.com
3
--excludeno tiene que ser el primero, pero debe aparecer en algún lugar antes del directorio fuente (probado con tar 1.29 en Cygwin)
wortwart

Respuestas:

1038

Puede tener múltiples opciones de exclusión para tar

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

etc funcionará Hacer seguro de que poner --exclude antes de los elementos de origen y de destino.

Charles Ma
fuente
78
Esta respuesta hace que parezca que --exclude es lo primero ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien
13
Como ejemplo, si está intentando hacer una copia de seguridad de su carpeta de proyectos de WordPress, excluyendo la carpeta de cargas, puede usar este comando: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content /
uploads
12
Se me ocurrió el siguiente comando: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . tenga en cuenta que la -fbandera debe preceder al archivo tar, consulte: superuser.com/a/559341/415047
Alfred Bez
21
Una "/" al final del directorio de exclusión hará que falle. Supongo que tar piensa que un final / es parte del nombre del directorio para excluir. MALO: --excluir = mydir / BUENO: --excluir = mydir
Josiah
44
> Asegúrese de poner --excluir antes de los elementos de origen y destino. O use una ruta absoluta para la exclusión: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight en Cloudinsidr.com
131

Puede excluir directorios con --excludepara tar.

Si desea archivar todo excepto /usrpuede usar:

tar -zcvf /all.tgz / --exclude=/usr

En tu caso tal vez algo como

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
Johan Soderberg
fuente
17
Para aclarar, puede usar la ruta completa para --excluir.
Johan Soderberg
2
en algunos casos, se requiere que --excluya preceda a los archivos / carpetas para archivar
kronuus
68

Posibles opciones para excluir archivos / directorios de la copia de seguridad usando tar:

Excluir archivos usando múltiples patrones

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Excluir archivos con un archivo de exclusión lleno de una lista de patrones

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Excluya archivos usando etiquetas colocando un archivo de etiqueta en cualquier directorio que deba omitirse

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Stephen Donecker
fuente
3
El orden de los parámetros parece importar y este formulario funciona para mí.
cstamas
1
Yo también. Para tar (GNU tar) 1.28 en Ubuntu 16.04, solo funcionó este orden específico de parámetros.
alvaroreig
43

antigua pregunta con muchas respuestas, pero descubrí que ninguna era lo suficientemente clara para mí, así que me gustaría agregar mi intento.

si tienes la siguiente estructura

/home/ftp/mysite/

con el siguiente archivo / carpetas

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

por lo tanto, desea crear un archivo tar que contenga todo dentro / home / ftp / mysite (para mover el sitio a un nuevo servidor), pero file3es solo basura, y todo lo que contiene folder3tampoco es necesario, por lo que omitiremos esos dos.

usamos el formato

tar -czvf <name of tar file> <what to tar> <any excludes>

donde c = create, z = zip y v = detallado (puede ver los archivos a medida que se ingresan, útil para asegurarse de que no se agregue ninguno de los archivos que excluya). y f = archivo.

entonces mi comando se vería así

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

tenga en cuenta que los archivos / carpetas excluidos son relativamente a la raíz de su tar (he intentado la ruta completa aquí en relación con / pero no puedo hacer que funcione).

Espero que esto ayude a alguien (y a mí la próxima vez que lo busque en Google)

Sverre
fuente
66
¡Esta respuesta definitivamente me ayudó! El problema para mí fue que mi orden se parecía a algo así tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', y esto no excluía nada.
Anish Ramaswamy
2
¡Su muestra fue muy similar a la que tuve problemas! ¡Gracias!
Qorbani
2
Agradable y claro gracias. Para mí, el problema era que otras respuestas incluyen el absoluto de las rutas relativas. Pero todo lo que tiene que hacer es agregar el nombre de la carpeta que desea excluir.
Hubert
2
Esta es una respuesta mucho más clara. Gracias al ejemplo, pude hacerlo funcionar ya que los caminos eran confusos al principio. ¡Gracias un montón!
fagiani
2
¡funcionó! Recuerde no agregar una barra inclinada final a la exclusión. Por ejemplo, mientras "archivo3" o "archivo3 / subcarpeta" funciona, "archivo3 /" y "archivo3 / subcarpeta /" no lo hacen.
lucaferrario 01 de
24

Puede usar la "notación de hormiga" estándar para excluir directorios relativos.
Esto funciona para mí y excluye cualquier directorio .git o node_module:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt contiene:

/ dev2 / java
/ dev2 / javascript

Eric Manley
fuente
44
Creo que esto requiere que la variable de opción de shell Bash globstartenga que estar habilitada. Consulte con shopt -s globstar. Creo que está desactivado por defecto en la mayoría de los sistemas operativos basados ​​en Unix. Del manual de Bash: " globstar: si está configurado, el patrón **utilizado en un contexto de expansión de nombre de archivo coincidirá con todos los archivos y cero o más directorios y subdirectorios. Si el patrón es seguido por un '/', solo coinciden los directorios y subdirectorios " .
not2qubit
15

He experimentado eso, al menos con la versión de tar de Cygwin que estoy usando ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" en Windows XP Home Edition SP3), el orden de las opciones es importante.

Si bien esta construcción funcionó para mí:

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

ese no funcionó:

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Esto, mientras tar --helprevela lo siguiente:

tar [OPTION...] [FILE]

Entonces, el segundo comando también debería funcionar, pero aparentemente no parece ser el caso ...

Mejores rgds,

GeertVc
fuente
55
Solo quiero agregar a lo anterior, que es importante que el directorio a excluir NO contenga una barra diagonal inversa final. Entonces, --exclude = '/ ruta / a / exclude / dir' es CORRECTO , --exclude = '/ ruta / a / exclude / dir /' es INCORRECTO .
GeertVc
17
Esto se debe a que el archivo de destino target.tgz es un argumento del interruptor f, que debería seguir
Valentino
14

Este patrón de exclusión maneja sufijos de nombre de archivo como png o mp3, así como nombres de directorio como .git y node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Scott Stensland
fuente
gracias, eso es lo que estaba buscando :)
Alexander Br.
11

Para aquellos que tienen problemas con él, algunas versiones de tar solo funcionarían correctamente sin el './' en el valor de exclusión.

Tar --version

alquitrán (GNU alquitrán) 1.27.1

Sintaxis del comando que funciona:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Estos no funcionarán:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
J. Lawson
fuente
10

Encontré esto en otro lugar, así que no tomaré el crédito, pero funcionó mejor que cualquiera de las soluciones anteriores para mis problemas específicos de Mac (a pesar de que está cerrado):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Robar
fuente
2
Gracias por esta respuesta, el tar en Darwin definitivamente tiene una sintaxis diferente y me estaba volviendo loco por qué "--exclude = blah" en las otras respuestas no funcionaban. Esto funcionó muy bien en una Mac.
Michael
1
No olvides COPYFILE_DISABLE=1usar tar, de lo contrario puedes obtener archivos ._ en tu tarball
Benoit Duffez
Gracias por incluir tu respuesta. Siempre es bueno incluir un enlace a la fuente donde encontraste la respuesta. Bonificación: si la fuente era de otra publicación stackoverflow o stackexchange, obtienes karma extra (puntos o insignias, no recuerdo cuál). De cualquier manera, obtienen una sonrisa, y todos ganan. Sin inconvenientes :-) También ayuda a las personas que desean buscar información adicional. A veces las personas votarán solo porque incluiste un enlace de origen. Finalmente, compartir el problema específico que abordó, o por qué esta fue una mejor solución, podría ayudar a alguien más con un problema único.
SherylHohman
8

Para Mac OSX tuve que hacer

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Tenga en cuenta el -fdespués de la--exclude=

Jerinaw
fuente
6

Estoy de acuerdo en que la bandera --excluir es el enfoque correcto.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

Una advertencia para un efecto secundario que no encontré inmediatamente obvio: ¡la exclusión de 'fileA' en este ejemplo buscará 'fileA' RECURSIVAMENTE!

Ejemplo: un directorio con un solo subdirectorio que contiene un archivo con el mismo nombre (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Si se utiliza --exclude='data.txt'el archivo no contendrá SEA datos.txt archivo. Esto puede causar resultados inesperados si se archivan bibliotecas de terceros, como un directorio node_modules.

  • Para evitar este problema, asegúrese de proporcionar la ruta completa, como --exclude='./dirA/data.txt'

Aaron Votre
fuente
5

Para evitar posibles 'xargs: Argument list too long'errores debido al uso de find ... | xargs ...cuando se procesan decenas de miles de archivos, puede canalizar la salida de finddirectamente al taruso find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
carlo
fuente
puede citar una cadena 'excluir', como esta: 'somedir / filesdir / *', entonces el shell no expandirá los asteriscos y otros caracteres en blanco.
Znik
xargs -n 1es otra opción para evitar xargs: Argument list too longerrores;)
Tuxdude
5

Después de leer este hilo, hice una pequeña prueba en RHEL 5 y aquí están mis resultados para agrupar el directorio abc:

Esto excluirá el error de directorios y registros y todos los archivos en los directorios:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

Agregar un comodín después del directorio excluido excluirá los archivos pero conservará los directorios:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Miguel
fuente
En el segundo ejemplo anterior, debería haber asteriscos después de la última barra inclinada en cada cláusula de exclusión, pero la publicación no los tomó.
Mike
4

Use el comando find junto con la opción tar append (-r). De esta manera, puede agregar archivos a un tar existente en un solo paso, en lugar de una solución de dos pasos (crear una lista de archivos, crear tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Alex B
fuente
4

También puede usar una de las opciones "--exclude-tag" según sus necesidades:

  • --exclude-tag = ARCHIVO
  • --exclude-tag-all = ARCHIVO
  • --exclude-tag-under = ARCHIVO

Se excluirá la carpeta que aloja el ARCHIVO especificado.

frommelmak
fuente
4

Después de leer todas estas buenas respuestas para diferentes versiones y haber resuelto el problema por mí mismo, creo que hay detalles muy pequeños que son muy importantes y raros para el uso general de GNU / Linux , que no están lo suficientemente estresados ​​y merecen más que comentarios.

Por lo tanto, no voy a tratar de responder la pregunta para cada caso, sino de registrar dónde buscar cuando las cosas no funcionan.

ES MUY IMPORTANTE AVISAR:

  1. EL ORDEN DE LAS OPCIONES IMPORTA: no es lo mismo poner el --excluir antes que después de la opción de archivo y los directorios para respaldar. Esto es inesperado al menos para mí, porque en mi experiencia, en los comandos GNU / Linux, generalmente el orden de las opciones no importa.
  2. Las diferentes versiones de tar esperan estas opciones en un orden diferente: por ejemplo, la respuesta de @ Andrew indica que en GNU tar v 1.26 y 1.28 las exclusiones son las últimas, mientras que en mi caso, con GNU tar 1.29, es al revés.
  3. EL TRAILING SLASHES IMPORTA : al menos en GNU tar 1.29, no debería ser ninguno .

En mi caso, para GNU tar 1.29 en Debian stretch, el comando que funcionó fue

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Las citas no importaron, funcionó con ellas o sin ellas.

Espero que esto sea útil para alguien.

usuario2553863
fuente
Gracias por su respuesta. Estaba buscando (lo que pareció mucho tiempo) una solución, y su respuesta me guió en la dirección correcta. Sin embargo, en mi caso (Ubuntu 18.04.3, Tar 1.29) solo pude hacerlo funcionar agregando el nombre de la carpeta y NO la ruta, por ejemplo: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. carpeta tgz
Nitai
2

Puede usar cpio (1) para crear archivos tar. cpio toma los archivos para archivar en stdin, por lo que si ya ha descubierto el comando de búsqueda que desea usar para seleccionar los archivos del archivo, póngalo en cpio para crear el archivo tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
camh
fuente
2

gnu tar v 1.26 el --exclude debe aparecer después de los argumentos del archivo de archivado y del directorio de respaldo, no debe tener barras iniciales ni finales, y no prefiere comillas (simples o dobles). Entonces, en relación con el directorio PADRE del que se realizará una copia de seguridad, es:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

Andrés
fuente
Después de mucha experimentación, he encontrado más o menos lo mismo con mi comando tar (GNU tar) 1.28.
PicoutputCls
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X indica un archivo que contiene una lista de nombres de archivo que deben excluirse de la copia de seguridad. Por ejemplo, puede especificar * ~ en este archivo para no incluir ningún nombre de archivo que termine con ~ en la copia de seguridad.

Ashwini Gupta
fuente
Creo que esta es la mejor solución, ya que incluso funciona en esos casos, que el número de exclusiones es grande. También es posible incluir la opción X en el paquete de opciones, por lo que la forma más corta es probablemente:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Su mejor opción es usar find con tar, a través de xargs (para manejar la gran cantidad de argumentos). Por ejemplo:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Joe
fuente
44
Eso puede hacer que se invoque tar varias veces, y también empacará archivos repetidamente. Correcto es:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen
Leí en alguna parte que, cuando se usa xargs, uno debería usar la ropción tar en lugar de cporque cuando findrealmente encuentra muchos resultados, los xargs dividirán esos resultados (según el límite de argumentos de la línea de comando local) en fragmentos e invocarán tar en cada parte. Esto dará como resultado un archivo que contiene el último fragmento devuelto por xargsy no todos los resultados encontrados por el findcomando.
Stphane
0

Posible respuesta redundante, pero como lo encontré útil, aquí está:

Mientras era un root de FreeBSD (es decir, usando csh), quería copiar todo mi sistema de archivos raíz a / mnt pero sin / usr y (obviamente) / mnt. Esto es lo que funcionó (estoy en /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

Todo mi punto es que era necesario (al poner el ./ ) especificar a tar que los directorios excluidos eran parte del directorio mayor que se estaba copiando.

Mi € 0.02

Jorge
fuente
0

No tuve suerte de obtener alquitrán para excluir un subdirectorio de 5 Gigabytes de algunos niveles de profundidad. Al final, acabo de usar el comando unix Zip. Funcionó mucho más fácil para mí.

Entonces, para este ejemplo particular de la publicación original
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

El equivalente sería:

zip -r /backup/filename.zip. -x upload / folder / ** \ * upload / folder2 / ** \ *

(NOTA: Aquí está la publicación que usé originalmente que me ayudó /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

usuario2792605
fuente
3
Cuidado: zipno empaca directorios vacíos, ¡pero lo tarhace!
t0r0X
0

Echale un vistazo

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
RohitPorwal
fuente
0

Quiero tener una versión frontal fresca (carpeta angular) en localhost. Además, la carpeta git es enorme en mi caso, y quiero excluirla. Necesito descargarlo del servidor y descomprimirlo para ejecutar la aplicación.

Comprima la carpeta angular de / var / lib / tomcat7 / webapps, muévala a la carpeta / tmp con el nombre angular.23.12.19.tar.gz

Comando:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
fuente
0

Caso de éxito: 1) si se proporciona la ruta completa para realizar una copia de seguridad, en excluir también se debe usar la ruta completa.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC

2) si se proporciona la ruta actual para realizar una copia de seguridad, en excluir también se debe usar solo la ruta actual.

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC

Caso de falla:

  1. si le da al directorio currentpath para hacer una copia de seguridad y la ruta completa para ignorar, entonces no funcionará

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC

Nota: mencionar excluir antes / después del directorio de respaldo está bien.

Sridhar Kumar N
fuente
0

Si está tratando de excluir archivos del Sistema de control de versiones (VCS), ¡tar ya admite dos opciones interesantes al respecto! :)

  1. Opción: --exclude-vcs

Excluye archivos y directorios utilizados por los siguientes sistemas de control de versiones: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurial, y Darcs.

A partir de la versión 1.32, se excluyen los siguientes archivos:

  • CVS/y todo lo que hay debajo
  • RCS/y todo lo que hay debajo
  • SCCS/y todo lo que hay debajo
  • .git/y todo lo que hay debajo
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/y todo lo que hay debajo
  • .arch-ids/y todo lo que hay debajo
  • {arch}/y todo lo que hay debajo
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Opción: --exclude-vcs-ignores

Cuando el archivo de directorios que se encuentran bajo algún sistema de control de versiones (VCS), a menudo es conveniente leer los patrones de exclusión de esta VCS' Ignorar archivos (por ejemplo .cvsignore, .gitignore, etc.) Esta opción proporciona esa posibilidad.

Antes de archivar un directorio, ver si contiene cualquiera de los siguientes archivos: cvsignore, .gitignore, .bzrignore, o .hgignore. Si es así, lea ignorar patrones de estos archivos.

Los patrones se tratan de la misma manera que los VCS correspondientes los tratarían, es decir:

.cvsignore

Contiene patrones globales de estilo shell que se aplican solo al directorio donde reside este archivo. No se permiten comentarios en el archivo. Las líneas vacías se ignoran.

.gitignore

Contiene patrones de globos de estilo de concha. Se aplica al directorio donde .gitfilese encuentra y a todos sus subdirectorios.

Cualquier línea que comience con un #es un comentario. La barra invertida se escapa del carácter del comentario.

.bzrignore

Contiene patrones globbing de shell y expresiones regulares (si tiene el prefijo RE:(16). Los patrones afectan el directorio y todos sus subdirectorios.

Cualquier línea que comience con un #es un comentario.

.hgignore

Contiene expresiones regulares posix (17). La línea syntax: globcambia a patrones de globo de concha. La línea syntax: regexpvuelve a cambiar. Los comentarios comienzan con a #. Los patrones afectan el directorio y todos sus subdirectorios.

  1. Ejemplo

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

TM
fuente
-1

El siguiente script bash debería hacer el truco. Utiliza la respuesta dada aquí por Marcus Sundman.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

Esto imprimirá el comando que necesita y simplemente puede copiarlo y pegarlo nuevamente. Probablemente haya una forma más elegante de proporcionarlo directamente a la línea de comando.

Simplemente cambie * .CC por cualquier otra extensión común, nombre de archivo o expresión regular que desee excluir y esto aún debería funcionar.

EDITAR

Solo para agregar una pequeña explicación; find genera una lista de archivos que coinciden con la expresión regular elegida (en este caso * .CC). Esta lista se pasa a través de xargs al comando echo. Esto imprime --excluye 'una entrada de la lista'. Las barras () son caracteres de escape para las 'marcas.

James
fuente
1
Requerir entrada interactiva es una mala elección de diseño para la mayoría de los scripts de shell. Hacer que lee los parámetros de línea de comandos en lugar y se obtiene el beneficio de la finalización de la cáscara de pestaña, la terminación de la historia, la edición de la historia, etc.
tripleee
1
Además, su script no funciona para rutas que contienen espacios en blanco o metacaracteres de shell. Básicamente, siempre debe poner las variables entre comillas dobles, a menos que requiera específicamente que el shell realice la tokenización de espacios en blanco y la expansión de comodines. Para más detalles, consulte stackoverflow.com/questions/10067266/…
tripleee