Estou tentando usar o GNU tar
para criar um tarball a partir de um diretório armazenado em uma unidade de rede. Esta unidade de rede padroniza o modo de tudo armazenado nela para 0700
( -rwx------
) e não pode ser alterado antes da criação do tarball.
Eu usei este comando para alterar as permissões dos meus arquivos armazenados dentro do tarball:
tar -c --mode=0644 -f project.tar ./project/
O problema é que tudo no tarball tem suas permissões alteradas para 0644
( -rw-r--r--
). Não há executáveis neste ./project/
diretório, portanto, 0644
todos os arquivos estão corretos, mas os diretórios0644
também acabam herdando . Após a extração em outro sistema, os diretórios não poderão ser inseridos até que o bit de execução seja adicionado.
É possível instruir o GNU a alterar tar
os modos de todos os arquivos0644
e alterar os modos de todos os diretórios para 0755
? Quase como -type f
e -type d
no find
comando.
O sistema operacional é a versão Debian 11 Bullseye, o GNU tar
é a versão 1.34.
Você pode usar permissões relativas como chmod , não apenas um modo fixo com
--mode
. Verifique o manual , não apenas a página de manual.Você pode usar use
a+r
para conceder permissão de leitura a todos ea+X
conceder permissão de execução se ela estiver presente em algum lugar.No entanto, se o sistema de arquivos tornar todos os arquivos executáveis, isso resultará em todos os arquivos executáveis no arquivo. Não acho que haja uma maneira de ajustar os arquivos de maneira diferente com o GNU tar. (Na verdade, não existe:
+X
também torna os diretórios executáveis se forem legíveis, entãoa=r,u+w,a+X
funciona .)Pax não tem nenhuma maneira de ajustar as permissões.
Acho que a abordagem mais simples é usar bindfs para criar uma visualização do sistema de arquivos com metadados diferentes. Este é um sistema de arquivos FUSE , portanto pode ser instalado e usado sem privilégios de administrador, desde que seu sistema tenha o próprio FUSE instalado. O Bindfs oferece mais flexibilidade que o tar do GNU
--mode
. Outro benefício é que ele pode ser usado com programas que não possuem algo semelhante aotar --mode
. Você pode usar a--perms
opção para alterar as permissões :Python possui um
tarfile
módulo que torna relativamente conveniente escrever código. Acho que suporta arquivamento iterativo para que você não precise armazenar todo o arquivo na memória de uma só vez. Mas você ainda teria que escrever bastante código.Com GNU
tar
, você pode fazer:O que levaria você
rwxr-xr-x
a arquivos do tipo diretório erw-r--r--
a todos os outros tipos (incluindo links simbólicos, até mesmo para diretórios). Isso é construído como:a=r
: redefine as permissões parar--r--r--
u+w
: adicionaw
au
ser, entãorw-r--r--
a+X
: adicionax
aa
ll, mas apenas em arquivos do tipo diretório, assim comorwxr-xr-x
para diretórios erw-r--r--
para qualquer outro tipo de arquivo.Para obter flexibilidade total, você pode usar
star
:Onde obtemos
rwxr-xr-x
arquivos do tipod
irectory,rwxrwxrwx
para arquivos do tipo syml
ink erw-r--r--
para qualquer outro tipo de arquivo.Ou usando as formas simbólicas:
Você poderia contornar
tar
a incapacidade de alterar atributos de acordo com as regras – não usandotar
.mksquashfs
possui uma minilinguagem para ações incorporada, que pode ser aplicada para arquivar entradas conforme elas aparecem, de acordo com algumas regras de filtragem; a coisa toda está documentada aqui . É bem simples: a sintaxe éaction@condition
, então para nós:fará com que todas as entradas do diretório tenham permissões 0755 e todos os arquivos tenham
0644
permissões. Você pode ter fifos, soquetes, links simbólicos em sua pasta, então talvez em vez de "diretórios" e "arquivos", a melhor categorização seria "diretórios" e "tudo que não seja um diretório"; em seguida, adicione alguma compactação que provavelmente seja mais rápida que a sua rede, de graça:Uso deste arquivo:
unsquashfs project.squashfs
(e provavelmente seu gerenciador de arquivos gráficos favorito também)mount -o loop gr-ieee802-11.squash /home/marcus/mnt/
udisksctl loop-setup -f project.squashfs
(e se isso não for montado automaticamente,udisksctl mount -b
ou clicando na unidade recém-aparecida em seu gerenciador de arquivos.