Eu tenho um diretório foo
com subdiretórios. Desejo criar os mesmos nomes de subdiretórios em outro diretório sem copiar seu conteúdo. Como eu faço isso?
Existe uma maneira de obter a ls
saída como uma lista de expansão de chaves?
Eu tenho um diretório foo
com subdiretórios. Desejo criar os mesmos nomes de subdiretórios em outro diretório sem copiar seu conteúdo. Como eu faço isso?
Existe uma maneira de obter a ls
saída como uma lista de expansão de chaves?
Usando
rsync
:Isso recriaria a estrutura de diretórios
/some/path/dir
comodir
no diretório atual, sem copiar nenhum arquivo.Qualquer diretório encontrado no caminho de origem seria criado no destino devido ao padrão de inclusão, mas qualquer outra coisa seria excluída. Como efeito colateral do uso de
-a
(--archive
), você obterá os mesmos carimbos de data/hora em todos os subdiretórios no destino e na origem. Isso também funciona para criar estruturas de diretórios locais a partir de diretórios remotos (e vice-versa).Tente isso,
. -type d
Para listar os diretórios no caminho atual recursivamente.mkdir -p -- /destination/directory/{}
criar diretório no destino.Isso se baseia em um
find
que suporta{}
a expansão no meio de uma palavra de argumento.Você pode usar
find
para percorrer a estrutura de origem e chamarmkdir
cada diretório que encontrar.Este exemplo, usando
find
, copiará sua estrutura de diretórios defoo
para/tmp/another/
O
exec
loop cria o conjunto de diretórios abaixofoo
, que é então passado para omkdir
. Se você não tiver uma versãofind
que entenda+
você pode usar\;
ao custo da eficiência. Substituamkdir
porecho mkdir
para ver o que aconteceria sem realmente fazê-lo.Com o shell bash, você pode solicitar a expansão de todos os diretórios com a
globstar
opção:e copie os diretórios com um loop:
... ou se você pensou que todos caberiam em uma chamada para
mkdir
:Essa é a sintaxe do array bash que diz: "pegue todos os elementos do
$@
array e substitua o início de cada um deles por/path/to/dest/
.Não estou ciente de uma maneira de obter
ls
a saída diretamente como uma lista de expansão de chaves. Se você tentasse massagear a saída da**/
expansão em uma expansão de contraventamento, você precisaria ter cuidado para:{
ou${
sequênciaEu não recomendaria.
A pergunta é uma duplicata entre sites de https://superuser.com/questions/1389580/copy-directory-structure-only-at-year-end
Esse tipo de tarefa é um caso de uso clássico para
mtree
:O acima cria todos os diretórios em
new-tree
que estavam presentes emold-tree
.mtree
não define carimbos de data e hora em diretórios recém-criados, portanto, a árvore resultante se parece com isso:Se você preferir que os
new-tree
timestamps correspondam aos deold-tree
, basta executarmtree
novamente. Como os diretórios já existem,mtree
modificará os carimbos de data e hora para corresponder à especificação de origem: