linux - ejemplos - descomprimir tar rar
Comando de shell al directorio tar, excluyendo ciertos archivos/carpetas (23)
¿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 .
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/*''
Echale un vistazo
tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
Encontré esto en otro lugar, así que no voy a tomar 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)>
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''
La siguiente secuencia de comandos bash debería hacer el truco. Utiliza la respuesta dada here 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 forma más elegante de proporcionarlo directamente a la línea de comandos.
Simplemente cambie * .CC por cualquier otra extensión común, nombre de archivo o expresión regular que desee excluir y esto aún debería funcionar.
EDITAR
Solo para añadir 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 --excluye ''una entrada de la lista''. Las barras () son caracteres de escape para las marcas ''.
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 Mac OSX tuve que hacer
tar -zcv --exclude=''folder'' -f theOutputTarFile.tar folderToTar
Tenga en cuenta la -f
después de --exclude=
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 -
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 poner ./ ) especificar a los directorios excluidos en qué parte del directorio mayor se está copiando.
Mis € 0.02
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 excluir directorios con --exclude
para tar.
Si quieres archivar todo excepto /usr
puedes 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
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
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, colóquelo en cpio para crear el archivo tar:
find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
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.
Use 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 {} /;
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.