linux - hat - Comando de shell al directorio tar, excluyendo ciertos archivos/carpetas




descomprimir zip linux terminal (16)

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

Esto excluirá los errores y registros de directorios 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/*'

¿Existe un comando / script de shell simple que permita excluir ciertos archivos / carpetas para que no se archiven?

Tengo un directorio que necesita archivarse con un subdirectorio que tiene una cantidad de archivos muy grandes que no necesito hacer una copia de seguridad.

No son soluciones del todo.

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

También podría usar el comando buscar 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=file para 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 cma funciona bien. El gran problema es que la --exclude='./folder' DEBE estar al principio del comando tar. Comando completo (cd primero, entonces la copia de seguridad es relativa a ese directorio):

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

Echale un vistazo

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

Esto excluye patrones de mangos como 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}

Estoy de acuerdo en que la bandera --exclude 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 'archivoA' en este ejemplo buscará 'archivoA' 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 usa --exclude='data.txt' el archivo no contendrá ni el archivo data.txt. Esto puede provocar 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'


Lo he experimentado, al menos con la versión Cygwin 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 edición de Windows XP Home Máquina 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 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 ...

Mejores rgds,


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

Así que 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 subir / carpeta / ** \ * subir / carpeta2 / ** \ *

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


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

Tar --version

tar (GNU tar) 1.27.1

Sintaxis de 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 *

Para evitar posibles errores 'xargs: Argument list too long' debido al uso de find ... | xargs ... find ... | xargs ... al procesar decenas de miles de archivos, puede canalizar la salida de find directamente a tar utilizando find ... -print0 | tar --null ... 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 -

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

Excluir archivos utilizando múltiples patrones

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

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

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

Excluya los archivos que usan 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

Pregunta antigua con muchas respuestas, pero encontré 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 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, usted desea crear un archivo tar que contenga todo dentro de / home / ftp / mysite (para mover el sitio a un nuevo servidor), pero el file3 es solo basura, y todo en la folder3 tampoco es necesario, por lo que los folder3 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, lo que es útil para asegurarse de que no se agreguen ninguno de los archivos que excluya). 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 relativos a la raíz de su archivo tar (he intentado la ruta completa aquí en relación con / pero no puedo hacer que funcione).

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


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

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

etc funcionará. Asegúrese de poner --exclude antes de los elementos de origen y destino.


Puede utilizar la "notación ant" 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


Su mejor apuesta 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

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

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

La carpeta que alberga el archivo especificado será excluida.


gnu tar v 1.26 el --exclude debe venir después de los argumentos del directorio y del archivo de copia de seguridad, no debe tener barras diagonales iniciales ni finales, y prefiere sin comillas (simple o doble). Entonces, en relación con el directorio de PADRES del que se realizará una copia de seguridad, es:

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


tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

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





tar