来自不同目录的tar文件没有路径

时间:2016-01-03 20:45:11

标签: bash shell archive tar

I have a following structure:

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

使用bash我需要在实际目录中创建一个.tar存档,它将包含4个文件(file1,file2,file3,file4)。我尝试过的所有内容都会根据路径存档文件。我需要的是只是文件的存档,它必须包含:

file1
file2
file3
file4

5 个答案:

答案 0 :(得分:3)

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

所以这个命令:

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

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

如果需要,您可以使用find输出或类似内容自动创建必要的命令行参数。

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

答案 1 :(得分:0)

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

function listOfProduct() {
    $('.list-of-product li').prepend('<input type="checkbox" name="list-of-product"><label class="list-of-product-element"></label>');
    $('.list-of-product li label').each(function (i) {
        i++ ;
        $(this).prev('input').attr('id', 'list-of-product-' + i);
        $(this).attr('for', 'list-of-product-' + i);
    });
}

请注意,仅当/ tmp和〜/ folder1位于同一文件系统上时,硬链接才有效。这只会产生链接而不会占用额外的磁盘空间。

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

答案 2 :(得分:0)

尝试此操作而不创建任何临时目录:

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

来自man pax

  

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

答案 3 :(得分:0)

由于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 :(得分:0)

您可以创建存档,然后更改目录,然后追加(使用r选项),而不是必须创建笨拙的链接或没有通配符,如下所示:< / p>

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返回。