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 ls
saída como uma lista de expansão de chaves?
Tente isso,
cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
Para listar diretórios no caminho atual recursivamente.mkdir -p -- /destination/directory/{}
criar diretório no destino. Isso se baseia em um find
que suporta expansão {}
no meio de uma palavra de argumento.
find
suporta a interpolação de{}
em outra sequência./source/dir/path
, então este poderá falhar com uma "lista de argumentos muito longa" erro quando as tentativas de shell para chamarfind
com a expansão da*
. Melhor usar apenas.
lá. Além disso, a maioria dasfind
implementações permite{}
ser usada mesmo quando concatenada com outra sequência, mas não é universal..
Em vez de*
neste caso. (Usando xarg para desempenho e segurança provavelmente exigiria um script externo para a concatenação path)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 e 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).fonte
rsync
!Você pode usar
find
para percorrer a estrutura de origem e chamarmkdir
cada diretório que ele atender.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 é passado para omkdir
. Se você não tem uma versãofind
disso,+
pode usar\;
ao custo da eficiência. Substituamkdir
porecho mkdir
para ver o que aconteceria sem realmente fazê-lo.fonte
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(ela não funciona com-exec ... \;
, embora)/path/to/{}
mas agora não consigo encontrar nenhuma versão em que funcione, por isso adaptei a solução. ObrigadoCom 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ê acha que todos eles se encaixam em uma chamada para
mkdir
:Essa é a sintaxe do bash array que diz: "pegue todos os elementos do
$@
array e substitua o início de cada um deles por/path/to/dest/
.Não conheço uma maneira de obter
ls
saída diretamente como uma lista de expansão de chaves. Se você tentou massagear a saída da**/
expansão em uma expansão de cinta, seria necessário ter cuidado para:{
ou${
sequênciaEu não recomendaria.
fonte
A pergunta é uma duplicata entre sites de /superuser/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 abaixo
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
carimbos de data e hora correspondam aosold-tree
, simplesmente executemtree
novamente. Como os diretórios já existem,mtree
os timestamps serão modificados para corresponder à especificação de origem:fonte