查找文件并将其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 -c
与xargs
会做,当你有大量的文件
另请参阅:
- GNU tar手册
- 我怎样才能从标准input生成一个焦油? ,searchnull
可能有另一种方法来实现你想要的。 基本上,
- 使用find命令来输出你要找的任何文件的path。 将stdoutredirect到您select的文件名。
-
然后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`