答案1
如果您有 GNUtar(这在 Linux 上很常见),那么您可以使用该--transform
选项。
例如,使用您当前的命令,我们可以看到有目录:
$ find . -name '*.c' | xargs tar -rf allcfiles.tar
$ tar tf allcfiles.tar
./b.c
./d/e.c
./a.c
通过变换我们可以避免这种情况:
$ find . -name '*.c' | xargs tar --transform='s!.*/!!' -rf allcfiles.tar
$ tar tf allcfiles.tar
b.c
e.c
a.c
里面的表达式--transform
是一个简单的sed
表达式。这只是剥离所有目录组件。
答案2
如果您的find
实现支持该-execdir
选项,您可以tar
像这样删除不带目录的文件:
find . -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +
只需确保 tar 文件的路径是绝对路径即可。
答案3
以下是仅使用 POSIX 兼容命令的方法:
find . -name '*.c' | pax -w -s ',.*/,,' > allcfiles.tar
如果你喜欢使用tar rf archive ...
,你需要从正确的开始空的存档在开始时,因为tar
在模式下真实不会创建存档replace
。为此,您可以首先运行以下命令来创建一个空的 TAR 存档:
printf "\000"| dd ibs=10k conv=sync > allcfiles.tar
顺便说一句,我更喜欢这个命令:
star cf allcfiles.tar -s ',*/,,' -find . -name '*.c'
因为这是最快的方法,因为每个star
文件只libfind
需要调用stat()
一次,因为stat
其中的数据libfind
用于star
在存档中设置文件元数据。