Comando tar de Linux: comprime un directorio pero excluye subdirectorios
-
20-08-2019 - |
Pregunta
Escenario: tengo un directorio en un servidor que aloja mi sitio web que contiene cientos de imágenes enviadas por los usuarios. Estoy creando un script de respaldo que toma todas las imágenes del directorio y las comprime en un archivo .tar.gz. El comando que tengo hasta ahora es:
tar -czpf /path/to/backups/my_backup.tar.gz ruta / a / images /
Problema: No dentro de mi ruta / a / images / Tengo un directorio llamado tmp /. Cuando ejecuto el comando, obtengo un archivo .tar.gz que contiene toda la imagen en la ruta / al directorio / images / y un subdirectorio llamado tmp /.
Pregunta: ¿Cómo puedo hacer que el comando omita / no incluya el subdirectorio tmp / en el archivo .tar.gz?
Un millón de gracias de antemano.
Solución
Está buscando el argumento --exclude
.
--exclude=PATTERN
Algunos usuarios encuentran exclude
opciones confusas. Aquí hay algunas trampas comunes:
-
El modo operativo principal de
tar
no actúa en el nombre de una ruta listado explícitamente en la línea de comando si uno de sus nombres de archivo Los componentes están excluidos. En el ejemplo anterior, si crea un archivar y excluir archivos que terminan con*.o
, pero explícitamente nombrar el archivodir.o/foo
después de que se hayan enumerado todas las opciones,--exclude=PATTERN
será excluido del archivo. -
A veces puedes confundir los significados de
--exclude-from=FILE-OF-PATTERNS
y-X FILE-OF-PATTERNS
(*
). Ser cuidado: useregexp
cuando los archivos a excluir son dado como un patrón en la línea de comando. Utilizar <=> para introducir el nombre de un archivo que contiene una lista de patrones, uno por línea; cada uno de estos los patrones pueden excluir cero, uno o muchos archivos. -
Cuando use <=>, asegúrese de citar el PATRÓN parámetro, por lo que GNU <=> ve caracteres comodín como <=>. Si tu no hagas esto, el shell puede expandir el <=> mismo usando archivos a mano, por lo que <=> podría recibir una lista de archivos en lugar de uno patrón, o ninguno en absoluto, lo que hace que el comando sea algo ilegal. Esto podría no corresponder a lo que desea.
Por ejemplo, escriba:
$ tar -c -f ARCHIVE.TAR --exclude '*.o' DIRECTORY
en lugar de:
$ tar -c -f ARCHIVE.TAR --exclude *.o DIRECTORY
- Debe usar la sintaxis de shell, o globbing, en lugar de <=> sintaxis, cuando se usan las opciones de exclusión en <=>. Si intentas usar <=> sintaxis para describir los archivos que se excluirán, su comando podría fallar.
Otros consejos
tar -czpf /path/to/backups/my_backup.tar.gz --exclude path/to/images/tmp path/to/images/
Esto debería funcionar (suponiendo GNU tar):
tar -czpf /path/to/backups/my_backup.tar.gz --exclude=tmp path/to/images/