如何从文件名列表中复制文件并无条件地将现有文件保留在目标中?
注意 cpio 默认情况下会覆盖旧的现有文件:
$ dpkg -L libgcc1 libstdc++6 |grep -e '^/lib/' -e '^/usr/lib/' | cpio -pdv ./test
./test/lib/i386-linux-gnu
cpio: ./test/lib/i386-linux-gnu/libgcc_s.so.1 not created: newer or same age version exists
./test/usr/lib/i386-linux-gnu
cpio: ./test/usr/lib/i386-linux-gnu/libstdc++.so.6.0.22 not created: newer or same age version exists
cpio: ./test/usr/lib/i386-linux-gnu/libstdc++.so.6 not created: newer or same age version exists
0 blocks
$ touch -ht 200102030405 $(find . )
$ dpkg -L libgcc1 libstdc++6 |grep -e '^/lib/' -e '^/usr/lib/' | cpio -pdv ./test
./test/lib/i386-linux-gnu
./test/lib/i386-linux-gnu/libgcc_s.so.1
./test/usr/lib/i386-linux-gnu
./test/usr/lib/i386-linux-gnu/libstdc++.so.6.0.22
./test/usr/lib/i386-linux-gnu/libstdc++.so.6
3222 blocks
$ #same version
$ dpkg -L libgcc1 libstdc++6 |grep -e '^/lib/' -e '^/usr/lib/' | cpio -pdv ./test
./test/lib/i386-linux-gnu
cpio: ./test/lib/i386-linux-gnu/libgcc_s.so.1 not created: newer or same age version exists
./test/usr/lib/i386-linux-gnu
cpio: ./test/usr/lib/i386-linux-gnu/libstdc++.so.6.0.22 not created: newer or same age version exists
cpio: ./test/usr/lib/i386-linux-gnu/libstdc++.so.6 not created: newer or same age version exists
0 blocks
$ cp --version
cp (GNU coreutils) 8.26
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Torbjorn Granlund, David MacKenzie, and Jim Meyering.
$
答案1
没有办法做到这一点cpio
。
不过,您可以用来star
完成这项工作。只需致电:
star -xpk < archive-name
顺便说一句:我不确定 GNU cpio 的行为是否正确,但 cpio 经常在系统管理中使用,因为它有一个未记录的功能,可以首先将文件提取到临时名称中,如果成功,则调用rename(2)
以非破坏性方式替换旧文件方式。所以官方的cpio
(不一定是GNU cpio)的行为就像install
程序一样。
如果您希望获得带有星标的此行为,请添加该-install
选项。