查找文件并将其tar(用空格)

好的,这里简单的问题。 我正在做一个简单的备份代码。 它工作正常,除非文件中有空格。 这是我如何find文件并将它们添加到一个tar归档文件:

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

问题是当文件在名称中有一个空格,因为tar认为它是一个文件夹。 基本上有一种方法可以在查找结果周围添加引号? 或者以不同的方式解决这个问题?

用这个:

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

它会:

  • 处理与空间,换行符,破折号和其他funniness文件
  • 处理无限数量的文件
  • 不会重复覆盖你的backup.tar.gz像使用tar -cxargs会做,当你有大量的文件

另请参阅:

  • GNU tar手册
  • 我怎样才能从标准input生成一个焦油? ,searchnull

可能有另一种方法来实现你想要的。 基本上,

  1. 使用find命令来输出你要找的任何文件的path。 将stdoutredirect到您select的文件名。
  2. 然后tar -T选项,它允许它获取一个文件位置列表(您刚刚创build的那个find!)

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

尝试运行:

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

为什么不:

 tar czvf backup.tar.gz * 

当然,使用find和xargs是很聪明的,但是你正在做的很难。

更新:Porges评论了一个发现选项,我认为是比我的答案更好的答案,或另一个: find -print0 ... | xargs -0 .... find -print0 ... | xargs -0 ....

最好的解决scheme似乎是创build一个文件列表,然后归档文件,因为您可以使用其他来源,并与列表做其他事情。

例如,这允许使用列表来计算被归档文件的大小:

 #!/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 

如果你有多个文件或目录,你想把它们压缩成独立的* .gz文件,你可以这样做。 可选-type f -atime

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

这将压缩httpd-log01.txt httpd-log02.txt到httpd-log01.txt.gz httpd-log02.txt.gz

为什么不给这样一个尝试: tar cvf scala.tar `find src -name *.scala`