我有一个 tar.gz 存档,其中包含一些可执行文件。有没有办法在我提取存档时自动使它们不可执行?我尝试使用 --mode 标志,但它显然没有任何作用。
tar xzf archive.tar.gz --mode 'a-x'
如果可能的话,我想使用 tar 本身设置权限,因为我事先不知道 tar 生成的文件夹的名称是什么。我可以使用 GNU tar 功能。
答案1
如果使用star
(包括在希利工具, 经过@希利(死者)) 代替 GNUtar
是一种选择,你可以这样做:
star xf file.tar -find ! -type d -chmod a-x
可以使用类似的接口find
来操作存档成员。
使用 libarchive's bsdtar
,并假设存档不包含除目录和常规的而不是硬链接,并且您不关心恢复任何文件元数据,您可以zip
在提取之前将存档转换为动态格式(不支持权限):
bsdtar --format zip -cf - @file.tar | bsdtar xvf -
这将创建具有默认权限的所有文件,并且umask
还应用了默认权限。因此,使用umask 022
,您将获得具有rwxr-xr-x
权限的目录和具有rw-r--r--
.
使用 GNU tar
,您可以实现类似的目标:
tar -xf file.tar --to-command='
set -o noclobber
mkdir -p -- "$(dirname -- "$TAR_FILENAME")" &&
cat > "$TAR_FILENAME"'
附加限制是,它不会创建下面没有常规文件的目录,并且如果某些目录名称以换行符结尾,则会失败。
答案2
您应该能够将设置 aumask
与 usingtar
的--no-same-permissions
参数结合起来,从而防止在提取时设置可执行位。