我正在尝试使用 GNUtar
从网络驱动器上存储的目录创建 tarball。该网络驱动器默认存储在其上的所有内容的模式为0700
( -rwx------
),并且在创建 tarball 之前无法更改。
我使用此命令更改了 tarball 中存储的文件的权限:
tar -c --mode=0644 -f project.tar ./project/
问题是 tarball 中的所有内容的权限都更改为0644
( -rw-r--r--
)。该目录中没有可执行文件./project/
,因此0644
对于所有文件都可以,但目录最终也会继承0644
。在另一个系统上提取时,在添加执行位之前无法输入目录。
是否可以指示GNU将所有文件tar
的模式更改为并将所有目录的模式更改为?几乎就像命令中的and一样。0644
0755
-type f
-type d
find
操作系统是 Debian 11 Bullseye 版本,GNUtar
是 1.34 版本。
您可以使用相对权限,例如 chmod,而不仅仅是固定模式
--mode
。检查手册,而不仅仅是手册页。您可以使用 use
a+r
授予每个人读取权限,并a+X
授予执行权限(如果它存在于任何地方)。但是,如果文件系统使所有文件都可执行,则将导致存档中的所有文件都可执行。我认为没有办法使用 GNU tar 来以不同的方式调整文件。(实际上,不存在:
+X
如果目录可读,也使目录可执行,所以a=r,u+w,a+X
有效。)Pax根本没有任何方法可以调整权限。
我认为最简单的方法是使用bindfs创建具有不同元数据的文件系统视图。这是一个FUSE文件系统,因此只要您的系统安装了 FUSE 本身,就可以在没有管理员权限的情况下安装和使用它。Bindfs 提供比 GNU tar 更高的灵活性
--mode
。另一个好处是它可以与不具有类似功能的程序一起使用tar --mode
。您可以使用该--perms
选项来更改权限:Python有一个
tarfile
模块,使得编写代码相对方便。我认为它支持迭代存档,因此您不需要立即将整个存档存储在内存中。但您仍然需要编写大量代码。使用GNU
tar
,您可以执行以下操作:这将为您
rwxr-xr-x
提供目录类型的文件以及rw-r--r--
所有其他类型的文件(包括符号链接,甚至目录)。其构建为:a=r
:重置权限r--r--r--
u+w
: 添加w
到u
ser,所以rw-r--r--
a+X
:添加x
到a
ll,但仅适用于目录类型的文件,因此rwxr-xr-x
适用于目录和rw-r--r--
任何其他类型的文件。为了获得充分的灵活性,您可以使用
star
:我们从哪里获取
rwxr-xr-x
目录类型的文件d
、rwxrwxrwx
符号l
墨水类型的文件以及rw-r--r--
任何其他类型的文件。或者使用符号形式:
您可以通过不使用 来解决
tar
无法根据规则更改属性的问题tar
。mksquashfs
具有内置操作的迷你语言,可以根据某些过滤规则应用于存档条目;整个事情都记录在这里。这很简单:语法是action@condition
,所以对我们来说:会让所有目录项都有0755权限,所有文件都有
0644
权限。您的文件夹中可能有 fifo、套接字、符号链接,因此也许更好的分类是“目录”和“非目录的所有内容”,而不是“目录”和“文件”;然后,免费添加一些可能比您的网络更快的压缩:该存档的用途:
unsquashfs project.squashfs
(也可能是您最喜欢的图形存档管理器)来提取mount -o loop gr-ieee802-11.squash /home/marcus/mnt/
udisksctl loop-setup -f project.squashfs
如果没有自动安装,udisksctl mount -b
或者单击文件管理器中新出现的驱动器。