GNU cpio

jopen 12年前
     <div id="p_fullcontent" class="detail">     <p>tar 和cpio 类似,从备份来看二者基本等效。都能将文件存到磁带并取出文件。都能使用几乎所有介质,因为核心设备驱动处理低级设备操作,对用户级程序看来所有设备都差不多。有些unix的软件包就是cpio压的。<br /> <span style="font-weight:bold;">项目地址</span>:<a href="/misc/goto?guid=4958194310970823283" target="_blank">http://www.gnu.org/software/cpio/<br /> </a><br /> <strong>cpio 用法举例:</strong><br /> 带目录结构拷贝指定文件到指定目录:<br /> find /backup/svr -name "63201.rpt" |cpio -pdl /print<br /> 将带目录结构的指定文件拷贝到一个指定的文件:<br /> find . -name "63201.rpt" |cpio -ov 63201.cpio<br /> 从文件中恢复:<br /> cpio -ivd 63201.cpio</p>     <div class="blogstory">      <p><strong>为什么cpio比tar好?有这样几个原因。</strong><br /> 1、cpio会保留硬连接(hard link),备份的时候这个很重要<br /> 2、cpio没有文件名长度的限制。确实,guntar在这一点上做过改进,允许使用长文件名(实际上是创建了一个临时文件用来保存实际的文件名),但是在非gnu的tar工具上仍然存在这个问题。<br /> 3、默认情况下,cpio保留时间戳<br /> 4、在编写脚本的时候,cpio可以更好的控制要操作哪些文件。因为cpio需要显式的制定要操作的文件列表,例如下面哪个更加容易理解?</p>      <p><span><span>find . -type f -name </span><span class="string">'*.sh'</span><span> -print | cpio -o | gzip >sh.cpio.gz <br /> </span></span></p>      <p>这儿有一个需要特别注意的:对于包含大量文件的列表,不能将find放在反引号(`)内,因为命令行长度会超出长度限制,因此必须使用中间文件。find和tar分开跑很明显会使得速度减慢。</p>      <p>下面这个例子更加复杂,将一部分文件打包到一个文件中,其它部分打包到另外一个文件中:</p>      <ol class="dp-c">       <li class="alt"><span><span>find . -depth -print >/tmp/files  </span></span></li>       <li><span>egrep    <span class="string">'\.sh$'</span><span> /tmp/files | cpio -o | gzip >with.cpio.gz  </span></span></li>       <li class="alt"><span>egrep -v <span class="string">'\.sh$'</span><span> /tmp/files | cpio -o | gzip >without.cpio.gz <br /> </span></span></li>      </ol>     </div>     <p>同样的,find和tar分开跑会使得速度变慢。创建多个中间文件也搞出了更多的混乱。gnutar稍好些,但是它的命令行参数却是不兼容的。</p>     <p>5、如果有很多文件需要通过网络在两台机器之间复制,则可以并行的跑几个cpio。例如:</p>     <ol class="dp-c">      <li class="alt"><span><span>find . -depth -print >/tmp/files  </span></span></li>      <li><span>split /tmp/files  </span></li>      <li class="alt"><span><span class="keyword">for</span><span> F </span><span class="keyword">in</span><span> /tmp/files?? ; </span><span class="keyword">do</span><span>  </span></span></li>      <li><span>cat $F | cpio -o | ssh destination <span class="string">"cd /target && cpio -idum"</span><span> &  </span></span></li>      <li class="alt"><span>done </span></li>     </ol>    </div>