¿Existe un comando / script de shell simple que permita excluir ciertos archivos / carpetas del archivo?
Tengo un directorio que necesita ser archivado con un subdirectorio que tiene una cantidad de archivos muy grandes que no necesito respaldar.
No del todo soluciones:
El tar --exclude=PATTERN
comando coincide con el patrón dado y excluye esos archivos, pero necesito que se ignoren archivos y carpetas específicos (ruta de archivo completa), de lo contrario, podrían excluirse los archivos válidos.
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 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 Charles Ma funciona bien. El gran problema es que --exclude='./folder'
DEBEN estar al comienzo del comando tar. Comando completo (primero cd, por lo que la copia de seguridad es relativa a ese directorio):
cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
--exclude
no tiene que ser el primero, pero debe aparecer en algún lugar antes del directorio fuente (probado con tar 1.29 en Cygwin)Respuestas:
Puede tener múltiples opciones de exclusión para tar
etc funcionará Hacer seguro de que poner
--exclude
antes de los elementos de origen y de destino.fuente
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
tenga en cuenta que la-f
bandera debe preceder al archivo tar, consulte: superuser.com/a/559341/415047Puede excluir directorios con
--exclude
para tar.Si desea archivar todo excepto
/usr
puede usar:En tu caso tal vez algo como
fuente
Posibles opciones para excluir archivos / directorios de la copia de seguridad usando tar:
Excluir archivos usando múltiples patrones
Excluir archivos con un archivo de exclusión lleno de una lista de patrones
Excluya archivos usando etiquetas colocando un archivo de etiqueta en cualquier directorio que deba omitirse
fuente
antigua pregunta con muchas respuestas, pero descubrí que ninguna era lo suficientemente clara para mí, así que me gustaría agregar mi intento.
si tienes la siguiente estructura
con el siguiente archivo / carpetas
por lo tanto, desea crear un archivo tar que contenga todo dentro / home / ftp / mysite (para mover el sitio a un nuevo servidor), pero
file3
es solo basura, y todo lo que contienefolder3
tampoco es necesario, por lo que omitiremos esos dos.usamos el formato
donde c = create, z = zip y v = detallado (puede ver los archivos a medida que se ingresan, útil para asegurarse de que no se agregue ninguno de los archivos que excluya). y f = archivo.
entonces mi comando se vería así
tenga en cuenta que los archivos / carpetas excluidos son relativamente a la raíz de su tar (he intentado 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)
fuente
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, y esto no excluía nada.Puede usar la "notación de hormiga" estándar para excluir directorios relativos.
Esto funciona para mí y excluye cualquier directorio .git o node_module:
myInputFile.txt contiene:
/ dev2 / java
/ dev2 / javascript
fuente
globstar
tenga que estar habilitada. Consulte conshopt -s globstar
. Creo que está desactivado por defecto en la mayoría de los sistemas operativos basados en Unix. Del manual de Bash: " globstar: si está configurado, el patrón**
utilizado en un contexto de expansión de nombre de archivo coincidirá con todos los archivos y cero o más directorios y subdirectorios. Si el patrón es seguido por un '/', solo coinciden los directorios y subdirectorios " .He experimentado eso, al menos con la versión de tar de Cygwin que estoy usando ("CYGWIN_NT-5.1 1.7.17 (0.262 / 5/3) 2012-10-19 14:39 i686 Cygwin" en Windows XP Home Edition SP3), el orden de las opciones es importante.
Si bien esta construcción funcionó para mí:
ese no funcionó:
Esto, mientras
tar --help
revela lo siguiente:Entonces, el segundo comando también debería funcionar, pero aparentemente no parece ser el caso ...
Mejores rgds,
fuente
Este patrón de exclusión maneja sufijos de nombre de archivo como png o mp3, así como nombres de directorio como .git y node_modules
fuente
Para aquellos que tienen problemas con él, algunas versiones de tar solo funcionarían correctamente sin el './' en el valor de exclusión.
Sintaxis del comando que funciona:
Estos no funcionarán:
fuente
Encontré esto en otro lugar, así que no tomaré el crédito, pero funcionó mejor que cualquiera de las soluciones anteriores para mis problemas específicos de Mac (a pesar de que está cerrado):
fuente
COPYFILE_DISABLE=1
usar tar, de lo contrario puedes obtener archivos ._ en tu tarballPara Mac OSX tuve que hacer
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Tenga en cuenta el
-f
después de la--exclude=
fuente
Estoy de acuerdo en que la bandera --excluir es el enfoque correcto.
Una advertencia para un efecto secundario que no encontré inmediatamente obvio: ¡la exclusión de 'fileA' en este ejemplo buscará 'fileA' RECURSIVAMENTE!
Ejemplo: un directorio con un solo subdirectorio que contiene un archivo con el mismo nombre (data.txt)
Si se utiliza
--exclude='data.txt'
el archivo no contendrá SEA datos.txt archivo. Esto puede causar 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'
fuente
Para evitar posibles
'xargs: Argument list too long'
errores debido al uso defind ... | xargs ...
cuando se procesan decenas de miles de archivos, puede canalizar la salida defind
directamente altar
usofind ... -print0 | tar --null ...
.fuente
xargs -n 1
es otra opción para evitarxargs: Argument list too long
errores;)Después de leer este hilo, hice una pequeña prueba en RHEL 5 y aquí están mis resultados para agrupar el directorio abc:
Esto excluirá el error de directorios y registros y todos los archivos en los directorios:
Agregar un comodín después del directorio excluido excluirá los archivos pero conservará los directorios:
fuente
Use el comando find 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 tar).
fuente
También puede usar una de las opciones "--exclude-tag" según sus necesidades:
Se excluirá la carpeta que aloja el ARCHIVO especificado.
fuente
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 merecen más que comentarios.
Por lo tanto, no voy a tratar de responder la pregunta para cada caso, sino de registrar dónde buscar cuando las cosas no funcionan.
ES MUY IMPORTANTE AVISAR:
En mi caso, para GNU tar 1.29 en Debian stretch, el comando que funcionó fue
Las citas no importaron, funcionó con ellas o sin ellas.
Espero que esto sea útil para alguien.
fuente
Puede usar cpio (1) para crear archivos tar. cpio toma los archivos para archivar en stdin, por lo que si ya ha descubierto el comando de búsqueda que desea usar para seleccionar los archivos del archivo, póngalo en cpio para crear el archivo tar:
fuente
gnu tar v 1.26 el --exclude debe aparecer después de los argumentos del archivo de archivado y del directorio de respaldo, no debe tener barras iniciales ni finales, y no prefiere comillas (simples o dobles). Entonces, en relación con el directorio PADRE del que se realizará una copia de seguridad, es:
tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude
fuente
tar (GNU tar) 1.28
.-X indica un archivo que contiene una lista de nombres de archivo que deben excluirse de la copia de seguridad. Por ejemplo, puede especificar * ~ en este archivo para no incluir ningún nombre de archivo que termine con ~ en la copia de seguridad.
fuente
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Su mejor opción es usar find con tar, a través de xargs (para manejar la gran cantidad de argumentos). Por ejemplo:
fuente
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
, uno debería usar lar
opción tar en lugar dec
porque cuandofind
realmente encuentra muchos resultados, los xargs dividirán esos resultados (según el límite de argumentos de la línea de comando local) en fragmentos e invocarán tar en cada parte. Esto dará como resultado un archivo que contiene el último fragmento devuelto porxargs
y no todos los resultados encontrados por elfind
comando.Posible respuesta redundante, pero como lo encontré útil, aquí está:
Mientras era un root 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 /):
Todo mi punto es que era necesario (al poner el ./ ) especificar a tar que los directorios excluidos eran parte del directorio mayor que se estaba copiando.
Mi € 0.02
fuente
No tuve suerte de obtener alquitrán para excluir un subdirectorio de 5 Gigabytes de algunos niveles de profundidad. Al final, acabo de usar el comando unix Zip. Funcionó mucho más fácil para mí.
Entonces, para este ejemplo particular de la publicación original
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)
El equivalente sería:
(NOTA: Aquí está la publicación que usé originalmente que me ayudó /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )
fuente
zip
no empaca directorios vacíos, ¡pero lotar
hace!Echale un vistazo
fuente
Quiero tener una versión frontal fresca (carpeta angular) en localhost. Además, la carpeta git es enorme en mi caso, y quiero excluirla. Necesito descargarlo del servidor y descomprimirlo para ejecutar la aplicación.
Comprima la carpeta angular de / var / lib / tomcat7 / webapps, muévala a la carpeta / tmp con el nombre angular.23.12.19.tar.gz
Comando:
fuente
Caso de éxito: 1) si se proporciona la ruta completa para realizar una copia de seguridad, en excluir también se debe usar la ruta completa.
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC
2) si se proporciona la ruta actual para realizar una copia de seguridad, en excluir también se debe usar solo la ruta actual.
tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC
Caso de falla:
si le da al directorio currentpath para hacer una copia de seguridad y la ruta completa para ignorar, entonces no funcionará
tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC
Nota: mencionar excluir antes / después del directorio de respaldo está bien.
fuente
Si está tratando de excluir archivos del Sistema de control de versiones (VCS), ¡tar ya admite dos opciones interesantes al respecto! :)
Excluye archivos y directorios utilizados por los siguientes sistemas de control de versiones:
CVS
,RCS
,SCCS
,SVN
,Arch
,Bazaar
,Mercurial
, yDarcs
.A partir de la versión 1.32, se excluyen los siguientes archivos:
CVS/
y todo lo que hay debajoRCS/
y todo lo que hay debajoSCCS/
y todo lo que hay debajo.git/
y todo lo que hay debajo.gitignore
.gitmodules
.gitattributes
.cvsignore
.svn/
y todo lo que hay debajo.arch-ids/
y todo lo que hay debajo{arch}/
y todo lo que hay debajo=RELEASE-ID
=meta-update
=update
.bzr
.bzrignore
.bzrtags
.hg
.hgignore
.hgrags
_darcs
Cuando el archivo de directorios que se encuentran bajo algún sistema de control de versiones (VCS), a menudo es conveniente leer los patrones de exclusión de esta VCS' Ignorar archivos (por ejemplo
.cvsignore
,.gitignore
, etc.) Esta opción proporciona esa posibilidad.Antes de archivar un directorio, ver si contiene cualquiera de los siguientes archivos:
cvsignore
,.gitignore
,.bzrignore
, o.hgignore
. Si es así, lea ignorar patrones de estos archivos.Los patrones se tratan de la misma manera que los VCS correspondientes los tratarían, es decir:
.cvsignore
Contiene patrones globales de estilo shell que se aplican solo al directorio donde reside este archivo. No se permiten comentarios en el archivo. Las líneas vacías se ignoran.
.gitignore
Contiene patrones de globos de estilo de concha. Se aplica al directorio donde
.gitfile
se encuentra y a todos sus subdirectorios.Cualquier línea que comience con un
#
es un comentario. La barra invertida se escapa del carácter del comentario..bzrignore
Contiene patrones globbing de shell y expresiones regulares (si tiene el prefijo
RE:
(16). Los patrones afectan el directorio y todos sus subdirectorios.Cualquier línea que comience con un
#
es un comentario..hgignore
Contiene expresiones regulares posix (17). La línea
syntax: glob
cambia a patrones de globo de concha. La líneasyntax: regexp
vuelve a cambiar. Los comentarios comienzan con a#
. Los patrones afectan el directorio y todos sus subdirectorios.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
fuente
El siguiente script bash debería hacer el truco. Utiliza la respuesta dada aquí por Marcus Sundman.
Esto imprimirá el comando que necesita y simplemente puede copiarlo y pegarlo nuevamente. Probablemente haya una forma 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 aún 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 --excluye 'una entrada de la lista'. Las barras () son caracteres de escape para las 'marcas.
fuente