tag puddletag picard musicbrainz mp3tag mac kid3 editar easytag linux find backup tar

linux - puddletag - musicbrainz picard



Encuentra los archivos y arrégleselos(con espacios) (8)

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?


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


Intenta ejecutar:

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


La mejor solución parece ser crear una lista de archivos y luego archivar archivos porque puede usar otras fuentes 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


Otra solución como se ve here :

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


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


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


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: