【问题标题】:Tar files from different directories without paths [closed]来自没有路径的不同目录的tar文件[关闭]
【发布时间】:2016-04-07 11:45:07
【问题描述】:
I have a following structure:

-folder1
   -folder2
     -file1
     -file2
   -folder3
     -folder4
       -folder5
         -file3
         -file4

使用 bash 我需要创建一个 .tar 存档在实际目录中,其中将包含 4 个文件(file1、file2、file3、file4)。我尝试过的所有东西都会用它们的路径来归档文件。我需要的是just files的存档,其中必须包含:

file1
file2
file3
file4

【问题讨论】:

标签: bash shell archive tar


【解决方案1】:

简单的解决方案是创建指向 /tmp 的硬链接,然后从那里存档,如下所示:

mkdir /tmp/allfiles
find /home/user/folder1 -type f | while read file
do
ln $file /tmp/allfiles
done
cd /tmp/allfiles
tar cvf /tmp/myarchive.tar *
rm /tmp/allfiles/*
rmdir /tmp/allfiles

请注意,硬链接仅在 /tmp 和 ~/folder1 位于同一文件系统上时才有效。这只会建立链接,不会消耗额外的磁盘空间。

您可以先删除 rm 命令。脚本中的类型可能会产生不好的结果:-)。

【讨论】:

  • 请注意,如果/tmp 位于单独的文件系统上,则您无法跨文件系统创建硬链接,但符号链接也不会正确。
【解决方案2】:

在不创建任何临时目录的情况下试试这个:

find .type f  | pax -wv -s '/.*\///g' -f file.tar

来自man pax

pax — 读取和写入文件存档并复制目录层次结构

【讨论】:

  • 标志/参数的解释和/或标志文档部分的链接在这里会有所帮助。
【解决方案3】:

由于tar 是为存储目录结构而构建的,如果您不保留它们,则必须先将它们删除...

为此,您可以创建临时目录以在一个 uniq 级别存储符号链接:

tmpdir=$(mktemp -d /tmp/tardir-XXXXXX)
find $PWD -type f -exec ln -st $tmpdir {} +
cd $tmpdir
tar -chvf /tmp/myarchive.tar *
cd -
rm -fR $tmpdir

注意:

  • $PWD 强制 find 将整个路径链接到临时目录。
  • -h tar 的选项告诉他存储指向的文件而不是符号链接。

【讨论】:

    【解决方案4】:

    如果您知道文件名及其目录,则可以使用 -C/--directory 选项让 tar 在处理参数时更改其操作目录。

    所以这个命令:

    tar -cf files.tar.gz -C folder1/folder2 file1 file2 -C ../folder3/folder4 file3 file4
    

    将在当前目录中创建files.tar.gz,其中仅包含文件。

    如果需要,您可以通过一些脚本从find 输出或类似的输出中自动创建必要的命令行参数。

    (你不能在文件参数位置使用像folder1/folder2/*这样的glob,因为这些文件名中的路径会导致tar找不到它们。你可以在那个位置使用$(ls folder1/folder2/),但这显然不安全对于许多有效的文件名。)

    【讨论】:

      【解决方案5】:

      不必创建笨拙的链接或不使用通配符,您可以创建存档,然后更改目录并追加到它(使用r 选项),如下所示:

      tar cvf ~/archive.tar file*                             # make initial tarball
      (cd folder2 && tar rvf ~/archive.tar file* )            # append others to it
      (cd folder3/folder4 && tar -rvf ~/archive.tar file*)    # and more...
      

      请注意,我在子 shell 中执行上述操作,以避免之后必须返回 cd

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 2023-03-22
        • 2021-08-27
        • 2015-06-11
        • 2013-01-27
        • 1970-01-01
        • 2016-11-14
        相关资源
        最近更新 更多