Comando Shell al directorio tar excluyendo ciertos archivos / carpetas


¿Hay un comando/script de shell simple que soporte excluir ciertos archivos/carpetas de ser archivados?

Tengo un directorio que necesita ser archivado con un subdirectorio que tiene un número de archivos muy grandes que no necesito respaldar.

No del todo soluciones:

El comando tar --exclude=PATTERN 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, los archivos válidos podrían ser excluir.

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 para 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 a excluir, luego usar rsync con --exclude-from=file para copiar todos los archivos a un directorio tmp, y luego usar tar para archivar ese directorio.

¿Puede alguien pensar en un mejor y más eficiente solución?

EDITAR: la solución de cma funciona bien. El gran truco es que el --exclude='./folder' DEBE estar al principio de la orden tar. Comando completo (cd primero, 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 .
Author: Rafa, 2009-06-12

23 answers

Puede tener múltiples opciones de exclusión para tar, por lo que

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

Etc funcionará. Hacer seguro para poner --exclude antes de los elementos de origen y destino.

 767
Author: Charles Ma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-16 08:15:55

Puede excluir directorios con --exclude para tar.

Si quieres archivar todo excepto /usr puedes usar:

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

En su caso tal vez algo como

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir
 117
Author: Johan Soderberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-11 12:13:53

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 usando un archivo de exclusión rellenado con una lista de patrones

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

Excluir archivos usando etiquetas colocando un archivo de etiqueta en cualquier directorio que se debe omitir

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
 50
Author: Stephen Donecker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 00:22:34

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

Si tiene la siguiente estructura

/home/ftp/mysite/

Con los siguientes archivos/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 hacer un archivo tar que contenga todo dentro de /home/ftp/mysite (para mover el sitio a un nuevo servidor), pero file3 es solo basura, y todo en folder3 tampoco 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 = verbose (puede ver los archivos a medida que se ingresan, útil para asegurarse de que no se agregue ninguno de los archivos que excluye). y f = archivo.

Entonces, mi orden 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 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)

 34
Author: Sverre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 10:48:59

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

Mientras que esta construcción funcionó para mí:

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

Que uno no trabajo:

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

Esto, mientras que tar --help revela lo siguiente:

tar [OPTION...] [FILE]

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

Mejor rgds,

 14
Author: GeertVc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-31 07:08:41

Puede usar la "notación ant" estándar para excluir directorios relativos.
Esto funciona para mí y excluye .directorios 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

 13
Author: Eric Manley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 14:10:55

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 esto está cerrado):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
 10
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-05 21:59:16

Esto excluye el patrón maneja el sufijo del nombre de archivo como png o mp3, así como los nombres de directorio como .git y node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
 9
Author: Scott Stensland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 20:55:16

Para Mac OSX tuve que hacer

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

Note el -f después del --exclude=

 5
Author: Jerinaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-06 20:07:56

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 pasadas (crear lista de archivos, crear tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
 4
Author: Alex B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 23:03:57

Para evitar posibles errores 'xargs: Argument list too long' debido al uso de find ... | xargs ... al procesar decenas de miles de archivos, puede canalizar la salida de find directamente a tar usando 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 -
 4
Author: carlo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-04 15:18:30

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

Esto excluirá el error de directorios y los registros y todos los archivos bajo 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/*'
 4
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 22:07:15

Estoy de acuerdo en que el indicador exclude exclude es el enfoque correcto.

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

Una palabra de 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 del mismo nombre (data.txt)

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

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

 4
Author: Aaron Votre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 15:56:04

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

Tar --version

Tar (GNU tar) 1.27.1

Sintaxis de comandos que funcionan:

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 *
 4
Author: J. Lawson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 07:07:32

Puede usar cpio(1) para crear archivos tar. cpio lleva los archivos a archivar en stdin, por lo que si ya ha descubierto el comando find que desea usar para seleccionar los archivos del archivo, pipe it into cpio para crear el archivo tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
 2
Author: camh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-12 05:53:17

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

  • exclude exclude-tag = FILE
  • exclude exclude-tag-all = FILE
  • exclude exclude-tag-under=FILE

Se excluirá la carpeta que aloja el ARCHIVO especificado.

 2
Author: frommelmak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-10 14:08:42

Gnu tar v 1.26 el exclude exclude tiene que venir después de los argumentos archivo y directorio de copia de seguridad, no debe tener barras al principio o al final, y prefiere no comillas (simples o dobles). Así que en relación con el directorio PADRE para ser respaldado, es:

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

 2
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-14 16:21:50

Lo mejor es usar find con tar, vía xargs (para manejar el gran número de argumentos). Por ejemplo:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
 1
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 23:04:12
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.

 1
Author: Ashwini Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-12 10:30:25

Posible respuesta redundante pero ya que la encontré útil, aquí está:

Mientras era root en FreeBSD (es decir, usando csh) quería copiar todo mi sistema de archivos root 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 -)

Mi punto es que era necesario (poniendo el ./ ) a especifique para tar que los directorios excluidos donde se copie parte del directorio mayor.

Mi €0.02

 0
Author: Georgios,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-04 22:35:38

No tuve suerte de conseguir que tar excluyera un subdirectorio de 5 Gigabytes a pocos niveles de profundidad. Al final, solo usé el comando Zip de Unix. Funcionó mucho más fácil para mí.

Así que para este ejemplo particular del post original
(tar --exclude='./ folder ' exclude exclude='./ upload / folder2 ' - zcvf / backup / filename.tgz . )

El equivalente sería:

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

(NOTA: Aquí está el post I originalmente usado que me ayudó https://superuser.com/questions/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t)

 0
Author: user2792605,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 10:18:27

Compruébalo

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
 0
Author: RohitPorwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 09:56:34

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 puede copiarlo y pegarlo de nuevo. Probablemente hay una forma más elegante de proporcionarlo directamente a la línea de comandos.

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

EDITAR

Solo para agregar una pequeña explicación; encontrar 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 a la orden echo. Esto imprime exclude excluir 'una entrada de la lista'. Las barras () son caracteres de escape para las marcas'.

 -1
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:58