查找文件并对它们进行tar(带空格)

Cal*_*ter 107 linux backup tar find

好吧,这里的问题很简单.我正在编写一个简单的备份代码.它工作正常,除非文件中有空格.这就是我找到文件并将它们添加到tar存档的方式:

find . -type f | xargs tar -czvf backup.tar.gz 
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*let 208

用这个:

find . -type f -print0 | tar -czvf backup.tar.gz --null -T -
Run Code Online (Sandbox Code Playgroud)

它会:

  • 处理带有空格,换行符,前导破折号和其他有趣的文件
  • 处理无限数量的文件
  • 不会重复覆盖你的backup.tar.gz就像使用tar -cwith xargs会在你拥有大量文件时一样

另见:

  • 请注意,如果有多个条件,则需要添加括号.否则`-print0`仅适用于最后一个表达式.例如`找到.\(-type f -o -name'*.c'\) - print0 | ...` (8认同)

err*_*one 14

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

  1. 使用find命令输出您要查找的文件的路径.将stdout重定向到您选择的文件名.
  2. 然后tar使用-T选项,它允许它获取一个文件位置列表(你刚用find创建的那个!)

    find . -name "*.whatever" > yourListOfFiles
    tar -cvf yourfile.tar -T yourListOfFiles
    
    Run Code Online (Sandbox Code Playgroud)


gst*_*eff 8

试试跑步:

    find . -type f | xargs -d "\n" tar -czvf backup.tar.gz 
Run Code Online (Sandbox Code Playgroud)


War*_* P 7

为什么不:

tar czvf backup.tar.gz *
Run Code Online (Sandbox Code Playgroud)

当然,使用find然后使用xargs是聪明的,但是你正在以艰难的方式去做.

更新:Porges评论了一个find-option,我认为这个答案比我的答案更好,或者另一个: find -print0 ... | xargs -0 ....