Bash 不带路径的不同目录中的Tar文件

Bash 不带路径的不同目录中的Tar文件,bash,shell,archive,tar,Bash,Shell,Archive,Tar,使用bash,我需要在实际目录中创建一个.tar归档文件,它将包含4个文件(file1、file2、file3、file4)。我尝试过的每件事都会将文件及其路径归档。我需要的是一个文件归档,其中必须包含: I have a following structure: -folder1 -folder2 -file1 -file2 -folder3 -folder4 -folder5 -file3 -fil

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

I have a following structure:

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

简单的解决方案是创建到/tmp的硬链接,然后从那里存档,类似这样:

file1
file2
file3
file4
注意,只有当/tmp和~/folder1都在同一个文件系统上时,硬链接才会起作用。这只会创建链接,不会占用额外的磁盘空间


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

简单的解决方案是创建指向/tmp的硬链接,然后从那里存档,类似这样:

file1
file2
file3
file4
注意,只有当/tmp和~/folder1都在同一个文件系统上时,硬链接才会起作用。这只会创建链接,不会占用额外的磁盘空间


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

在不创建任何临时目录的情况下尝试此操作:

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
发件人:

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


在不创建任何临时目录的情况下尝试此操作:

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
发件人:

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


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

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

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

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

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

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

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

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

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

所以这个命令:

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
将在当前目录中创建
文件.tar.gz
,其中仅包含文件

您可以从
find
output或类似文件自动创建必要的命令行参数,必要时只需编写一点脚本


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

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

所以这个命令:

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
将在当前目录中创建
文件.tar.gz
,其中仅包含文件

您可以从
find
output或类似文件自动创建必要的命令行参数,必要时只需编写一点脚本


(您不能在文件参数位置使用像
folder1/folder2/*
这样的全局变量,因为这些文件名中的路径将导致
tar
无法找到它们。您可以在该位置使用
$(ls folder1/folder2/)
,但对于许多有效的文件名来说,这显然是不安全的。)您不必创建笨拙的链接或不使用通配符,您可以创建归档文件,然后更改目录并附加到其中(使用
r
选项),如下所示:

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

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

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

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

请注意,我在子shell中执行上述操作是为了避免以后返回
cd

您是否尝试过--strip components=n或--strip=n(提取时使用),请参见?@user2672165否,因为我不需要提取它,只需创建您尝试过--strip components=n或--strip=n(提取时使用),请参见?@user2672165否,因为我不需要提取它,所以在这里创建标志/参数的解释和/或指向标志文档部分的链接会很有帮助。在这里解释标志/参数和/或指向标志文档部分的链接会很有帮助。请注意,如果
/tmp
位于单独的文件系统上,然后,您无法跨文件系统创建硬链接,但符号链接也不正确。请注意,如果
/tmp
位于单独的文件系统上,则您无法跨文件系统创建硬链接,但符号链接也不正确。