
Recebi o requisito de criar uma imagem espelhada de diretórios e subdiretórios de pastas existentes do Linux, conforme abaixo.
temos o diretório "/opt/current" que tem outra camada de 20 subdiretórios e mais uma camada com 50 subdiretórios e assim por diante... mais algumas camadas mais profundas para subdiretórios e no total temos 1000 diretórios de pai para filho. o /opt/current é montado no dispositivo Oracle ZFS.
Como criar uma estrutura exata de diretórios/subdiretórios espelhados no novo local /opt/New não manualmente como um para um diretório e aplicar permissões. o /opt/New é montado em outro dispositivo ZFS.
Existe uma maneira/script de criar toda a estrutura de diretórios de pai para filho com a mesma permissão de proprietário/grupo/outra em/opt/Novo caminho como em/opt/caminho atual?
obrigado, C.G.
Responder1
rsync -av --include='*/' --exclude='*' /opt/current/ /opt/New
Isso seria usado rsync
para duplicar exatamente a estrutura de diretórios de /opt/local
in /opt/New
, evitando copiar quaisquer arquivos.
A -a
opção ( --archive
) garantiria que todas as permissões etc. fossem preservadas (esta opção também implica uma cópia recursiva) e -v
( --verbose
) daria uma indicação do progresso do comando.
Com --include='*/'
incluímos explicitamente qualquer diretório na transferência, mas excluímos todo o resto com --exclude='*'
. A ordenação destas opções na linha de comando é importante.
O /
final /opt/current/
também é importante, pois sem ele o resultado seria criar /opt/New/current
em vez de escrever /opt/New
diretamente.
Responder2
POSIXly e assumindo que nomes de diretório não contêm caracteres de nova linha e $srcdir
são $dstdir
caminhos absolutos:
(cd -P "$srcdir" && find . -type d | pax -rwdpe "$dstdir/")
Algumas pax
implementações suportam a obtenção de listas de arquivos delimitados por NUL para copiar com uma -0
opção para permitir nomes de arquivos com NULs:
(cd -P "$srcdir" && find . -type d -print0 | pax -0rwdpe "$dstdir/")
( -print0
também é uma extensão não POSIX).
Responder3
Alternativamente pararsync
find /opt/current -type d -print0 | cpio -0pma backup/dir/
Responder4
Você pode criar um script como o seguinte... colocá-lo em um arquivo:
-- a sintaxe do script bash/ksh precisará mudar dependendo do shell ----
find . -name "*"|while read line
do
if [[ -d ${line} ]]
then
echo ${line}
fi
do
no servidor você está criando o arquivo
cat file |while read line
do
mkdir ${line}
done