Encuentra los archivos y arrégleselos (con espacios)

Bien, problema tan simple aquí. Estoy trabajando en un código de copia de seguridad simple. Funciona bien, excepto si los archivos tienen espacios en ellos. Así es como estoy buscando archivos y agregándolos a un archivo tar:

find . -type f | xargs tar -czvf backup.tar.gz 

El problema es cuando el archivo tiene un espacio en el nombre porque tar cree que es una carpeta. Básicamente, ¿hay alguna manera de agregar citas sobre los resultados de find? O una forma diferente de arreglar esto?

Utilizar esta:

 find . -type f -print0 | tar -czvf backup.tar.gz --null -T - 

Va a:

  • tratar con archivos con espacios, líneas nuevas, guiones principales y otras cosas divertidas
  • manejar una cantidad ilimitada de archivos
  • no sobrescribirá repetidamente su copia de seguridad. tar.gz como usar tar -c con xargs cuando tenga una gran cantidad de archivos

Ver también:

  • GNU tar manual
  • ¿Cómo puedo construir un archivo tar desde stdin? , busque null

Podría haber otra forma de lograr lo que quieres. Básicamente,

  1. Utilice el comando find para dar salida a la ruta a los archivos que está buscando. Redireccione stdout a un nombre de archivo de su elección.
  2. Luego tar con la opción -T que le permite tomar una lista de ubicaciones de archivos (¡la que acaba de crear con find!)

     find . -name "*.whatever" > yourListOfFiles tar -cvf yourfile.tar -T yourListOfFiles 

Intenta ejecutar:

  find . -type f | xargs -d "\n" tar -czvf backup.tar.gz 

Por qué no:

 tar czvf backup.tar.gz * 

Claro que es inteligente usar find y luego xargs, pero lo estás haciendo de la manera difícil.

Actualización: Porges ha comentado con una opción de búsqueda que creo que es una mejor respuesta que mi respuesta, o la otra: find -print0 ... | xargs -0 .... find -print0 ... | xargs -0 ....

Si tiene varios archivos o directorios y desea comprimirlos en un archivo *.gz independiente, puede hacerlo. Opcional -type f -atime

 find -name "httpd-log*.txt" -type f -mtime +1 -exec tar -vzcf {}.gz {} \; 

Esto comprimirá

 httpd-log01.txt httpd-log02.txt 

a

 httpd-log01.txt.gz httpd-log02.txt.gz 

¿Por qué no probar algo como esto? tar cvf scala.tar `find src -name *.scala`

Otra solución como se ve aquí :

 find var/log/ -iname "anaconda.*" -exec tar -cvzf file.tar.gz {} + 

La mejor solución parece ser crear una lista de archivos y luego archivar archivos porque puede usar otras fonts y hacer otra cosa con la lista.

Por ejemplo, esto permite usar la lista para calcular el tamaño de los archivos que se archivan:

 #!/bin/sh backupFileName="backup-big-$(date +"%Y%m%d-%H%M")" backupRoot="/var/www" backupOutPath="" archivePath=$backupOutPath$backupFileName.tar.gz listOfFilesPath=$backupOutPath$backupFileName.filelist # # Make a list of files/directories to archive # echo "" > $listOfFilesPath echo "${backupRoot}/uploads" >> $listOfFilesPath echo "${backupRoot}/extra/user/data" >> $listOfFilesPath find "${backupRoot}/drupal_root/sites/" -name "files" -type d >> $listOfFilesPath # # Size calculation # sizeForProgress=` cat $listOfFilesPath | while read nextFile;do if [ ! -z "$nextFile" ]; then du -sb "$nextFile" fi done | awk '{size+=$1} END {print size}' ` # # Archive with progress # ## simple with dump of all files currently archived #tar -czvf $archivePath -T $listOfFilesPath ## progress bar sizeForShow=$(($sizeForProgress/1024/1024)) echo -e "\nRunning backup [source files are $sizeForShow MiB]\n" tar -cPp -T $listOfFilesPath | pv -s $sizeForProgress | gzip > $archivePath