it-swarm.dev

Comando de shell al 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 necesita archivarse con un subdirectorio que tiene una cantidad de archivos muy grandes que no necesito hacer una copia de seguridad.

No son exactamente 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 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 el --exclude='./folder'DEBEestar al principio del comando tar. Comando completo (primero cd, así que la copia de seguridad es relativa a ese directorio):

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

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

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

etc funcionará. Haga seguro para poner --exclude antes de los elementos de origen y destino.

881
Charles Ma

Puede excluir directorios con --exclude para tar.

Si desea archivar todo, excepto /usr, puede usar:

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

En tu caso quizás algo como

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

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
53
Stephen Donecker

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, desea crear 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 lo que está en folder3 tampoco es necesario, así que los omitiremos 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 agregue 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)

38
Sverre

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

17
Eric Manley

He experimentado que, al menos con 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.

Si bien 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 ...

Mejores rgds,

16
GeertVc

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}
12
Scott Stensland

Encontré esto en otro lugar, así que no me daré 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 <archive> <source(s)>
10
Rob

Para Mac OSX tuve que hacer

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

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

7
Jerinaw

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 *
7
J. Lawson

Para evitar posibles errores de '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 -
5
carlo

Estoy de acuerdo en que la bandera --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 '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 usa --exclude='data.txt', el archivo no contendráNIdata.txt. Esto puede provocar resultados inesperados si se archivan bibliotecas de terceros, como un directorio node_modules.

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

5
Aaron Votre

Utilice el comando de búsqueda 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 un tar).

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

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 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/*'
4
Mike

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.

3
frommelmak

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

2
Andrew

Puedes usar cpio (1) para crear archivos tar. cpio lleva los archivos para archivar en la entrada estándar, por lo que si ya ha descubierto el comando de búsqueda que desea usar para seleccionar los archivos del archivo, canalícelo a cpio para crear el archivo tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
camh
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.

1
Ashwini Gupta

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
1
Joe

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 merece más que comentarios.

Por lo tanto, no intentaré responder la pregunta en cada caso, sino que intentaré registrar dónde buscar cuando las cosas no funcionan.

IT IS MUY IMPORTANTE PARA EL AVISO:

  1. EL ORDEN DE LA OPCIÓN DE LAS OPCIONES: no es lo mismo poner el --exclude antes que después de la opción de archivo y los directorios de copia de seguridad. Esto es inesperado, al menos para mí, porque en mi experiencia, en los comandos de GNU/Linux, generalmente el orden de las opciones no importa.
  2. Diferentes versiones de tar esperan estas opciones en orden diferente: por ejemplo, la respuesta de @ Andrew indica que en GNU tar v 1.26 y 1.28 la exclusión viene en último lugar, mientras que en mi caso , con GNU tar 1.29, es al revés.
  3. EL TRAILING SLASHES MATTER : al menos en GNU tar 1.29, no debería ser ningún .

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

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

Las citas no importaban, funcionaba con o sin ellas.

Espero que esto sea de utilidad para alguien.

1
user2553863

Echale un vistazo

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

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ó https://superuser.com/questions/312301/unix-Zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

0
user2792605

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

Mientras que una raíz de FreeBSD (es decir, usando csh) quise 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 lo que quiero decir es que fue necesario (al colocar el ./ ) en especificar para que los directorios excluidos sean parte del directorio mayor que se está copiando.

Mis € 0.02

0
George