TAR 文件:将文件从子目录移动到主目录

TAR 文件:将文件从子目录移动到主目录

我一直在尝试使用这段代码:

find documents -maxdepth 1 -type f -print0 | xargs -0 tar cvf documents.tar.gz

创建目录文档的备份。

该目录的结构为:

在此输入图像描述

我想将它们归档到单个目录 files/ 中:

在此输入图像描述

但我没能这样做。我怎样才能做到这一点?谢谢

答案1

您可以将它们硬链接到不同的目录,而不是 tar

# find all files in directory named directory
find directory -type f | \
while read f;
do
    f2=`echo "$f"|sed -e 's/\//:/g'`  # replace / with :
    ln "$f" "directory2/$f2"  # create hardlinks in directory2/
done

这将创建以下链接

directory/file1 => directory2/directory:file1
directory/file2 => directory2/directory:file2
directory/folder1/file3 => directory2/directory:folder1:file3
directory/folder1/file4 => directory2/directory:folder1:file4
directory/folder2/file5 => directory2/directory:folder2:file5
directory/folder3/folder4/file6 => directory2/directory:folder3:folder4:file6
directory/folder3/folder4/file7 => directory2/directory:folder3:folder4:file7

答案2

我想做到这一点的方法是创建一个新目录作为备份源并用硬链接填充它。我希望您要备份的整个目录树位于同一卷上。

> pwd
/path/to/documents
> cd /path/to/
> mkdir tar-documents
> mkdir tar-documents/documents
> ln /path/to/documents/file1
> ln /path/to/documents/file2
> ln /path/to/documents/folder1/file3 folder1:file3
[...]

如果文件数量很多,那么这应该通过脚本来完成。

然后你tar在这个目录上运行:

> cd /path/to/tar-documents
> tar cvzf /backup/path/documents.tar.gz documents

最后删除该tar目录可能会有用。

答案3

你可以试试这个。

查找*tar当前文件夹中的所有文件并复制到MainDirectory文件夹或任何您想要的位置。

find . -iname "*tar*" -exec cp {} ~/MainDirectory/ \;

答案4

首先,如果要存档目录,在存档中具有相同的文件结构是拍摄该快照的最佳实践。您要求的是重命名文件以包括其父目录,后跟冒号,后跟文件名。然而对我来说奇怪的是,这脱离了上下文,我确实设法使用该--transform选项非常接近:

 --transform=EXPRESSION, --xform=EXPRESSION
                         use sed replace EXPRESSION to transform file

一个例子概述于这个堆栈交换答案 (尽管请注意,这不是正确的sed语法。使用--transform你的命令将是这样的:

tar czvf documents.tar.gz --transform 's/\//:/g' documents

不幸的是,这没有达到预期的效果,因为它将您的子目录保留在存档中,但它们是空的,并且文件位于存档的根目录中,而不是在第一个父目录中。

我想我有一个使用-C, --directory选项的解决方案,但它不会非常动态,也不会适应在新文件名中维护文件的目录名。

我找到的解决方案是您所拥有的解决方案和转换命令的使用的混合:

find documents -type f -print0 | xargs -0 tar czvf test.tar.gz --no-recursion --transform 's/\//:/g' --transform 's:\::/:1' documents/

另外,在您的问题中,您使用扩展名命名文件.gz,但缺少该-z, --gzip选项。

希望这有帮助,
亚历克斯

相关内容