Bash 不带路径的不同目录中的Tar文件
使用bash,我需要在实际目录中创建一个.tar归档文件,它将包含4个文件(file1、file2、file3、file4)。我尝试过的每件事都会将文件及其路径归档。我需要的是一个文件归档,其中必须包含: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
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
位于单独的文件系统上,则您无法跨文件系统创建硬链接,但符号链接也不正确。