如何压缩所有没有路径的文件

如何压缩所有没有路径的文件

我想找到当前目录和子目录中的所有 .c 文件并将其压缩。我尝试使用以下方法来实现此目标,但是当我解压缩文件时,文件位于不同的文件夹中。我不想在压缩文件时包含目录。

该脚本应排除所有其他文件,并且不应维护这些 .c 文件的目录结构。

find . -name '*.c' | xargs tar -rf allcfiles.tar 

在此输入图像描述

答案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在存档中设置文件元数据。

相关内容