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,
- 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.
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
conxargs
cuando tenga una gran cantidad de archivos
Ver también: