首页 文章

来自不同目录的tar文件没有路径[关闭]

提问于
浏览
0
I have a following structure:

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

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

file1
file2
file3
file4

5 回答

  • 0

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

    所以这个命令:

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

    将在当前目录中仅使用其中的文件创建 files.tar.gz .

    如果需要,您可以使用一些脚本自动创建 find 输出或类似的必要命令行参数 .

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

  • 3

    简单的解决方案是创建到/ 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命令 . 你的脚本中的类型可能会有不好的结果:-) .

  • 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 force find 将整个路径链接到临时目录 .

    • -h 选项 tar 告诉他存储指向文件而不是符号链接 .

  • 0

    试试这个而不创建任何临时目录:

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

    来自man pax

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

  • 0

    您可以创建存档,然后更改目录并附加到它(使用 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 .

相关问题