Comando de shell para el directorio tar excluyendo ciertos archivos / carpetas

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

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

No del todo las soluciones:

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, los archivos válidos podrían ser excluidos.

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 para excluir, luego usar rsync con --exclude-from=file para copiar todos los archivos en 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 comienzo del comando tar. Comando completo (primero, cd, para que la copia de seguridad sea relativa a ese directorio):

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

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

 $ 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 excluir directorios con --exclude para tar.

Si desea archivar todo excepto /usr , puede usar:

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

En su caso, tal vez algo así como

 tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir 

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 utilizando un archivo de exclusión lleno de una lista de patrones

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

Excluir archivos usando tags colocando un archivo de etiqueta en cualquier directorio que deba omitirse

 tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup 

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

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 

entonces, desea crear un archivo tar que contenga todo dentro de / home / ftp / mysite (para mover el sitio a un nuevo servidor), pero file3 es simplemente basura, y todo en la folder3 tampoco es necesario, por lo que omitiremos esos dos.

usamos el formato

 tar -czvf    

donde c = create, z = zip y v = verbose (puede ver los archivos tal como se ingresan, útiles para asegurarse de que ninguno de los archivos que excluye se está agregando). 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 están relacionados con la raíz de su tar (he intentado con 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)

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

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

 tar cfvz target.tgz --exclude='' --exclude='' target_dir 

ese no funcionó:

 tar cfvz --exclude='' --exclude='' 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 …

Los mejores rgds,

Puede usar 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

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

 tar zc --exclude __MACOSX --exclude .DS_Store -f   

Este patrón de exclusión maneja sufijo 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} 

Para Mac OSX, tuve que hacer

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

Tenga en cuenta el -f después del --exclude=

Use el comando find junto con la opción tar append (-r). De esta forma, puede agregar archivos a un archivo 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 {} \; 

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 - 

Después de leer este hilo, hice algunas pruebas en RHEL 5 y aquí están mis resultados para subir el directorio abc:

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

Estoy de acuerdo en que el indicador –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 ‘fileA’ en este ejemplo buscará ‘fileA’ RECURSIVELY!

Ejemplo: un directorio con un único subdirectorio que contiene un archivo del mismo nombre (data.txt)

 data.txt config.txt --+dirA | data.txt | config.docx 
  • Si usa --exclude='data.txt' el archivo comprimido no contendrá NINGÚN archivo data.txt. Esto puede causar resultados inesperados si archiva bibliotecas de terceros, como un directorio node_modules.

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

Puede usar cpio (1) para crear archivos tar. cpio toma los archivos para archivar en stdin, por lo que si ya descubrió el comando find que desea usar para seleccionar los archivos, archívelo a cpio para crear el archivo tar:

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

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

La carpeta que aloja el ARCHIVO especificado se excluirá.

gnu tar v 1.26 el –exclude debe venir después de los argumentos del archivo de almacenamiento y del directorio de respaldo, no debe tener barras diagonales iniciales o finales, y no prefiere comillas (simples o dobles). Por lo tanto, en relación con el directorio de padres para la copia de seguridad, es:

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

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 

tar (GNU tar) 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 * 

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

 find / -print0 | xargs -0 tar cjf tarfile.tar.bz2 
 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. Por ejemplo, puede especificar * ~ en este archivo para que no incluya ningún nombre de archivo que termine con ~ en la copia de seguridad.

Posible respuesta redundante, pero como me pareció útil, aquí está:

Mientras que una raíz 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 -) 

Mi punto es que era necesario (al poner el ./ ) especificar que los directorios excluidos eran parte del directorio más grande que se estaba copiando.

Mi € 0.02

No tuve suerte haciendo que tar excluyera un subdirectorio de 5 Gigabytes de profundidad. Al final, acabo de usar el comando Zip de Unix. Me funcionó mucho más fácil.

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 carga / carpeta / ** \ * carga / carpeta2 / ** \ *

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

Echale un vistazo

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

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 nuevamente. Probablemente haya una manera 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 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 –excluya ‘una entrada de la lista’. Las barras inclinadas () son caracteres de escape para las ‘marcas.

Intereting Posts