Copie a estrutura de diretórios sem copiar arquivos no Mac OS X

7

Eu gostaria de duplicar a estrutura de diretórios em algum diretório para outro, sem copiar nenhum arquivo real. No lugar dos arquivos, eu gostaria de um arquivo em branco com o mesmo nome ou um link simbólico para o local original.

Como eu poderia fazer isso no OS X? Ferramentas de linha de comando (rsync / find / tar / whatever), shell scripts, etc., são todas aceitáveis, o software que tenho que comprar provavelmente não é.

ShreevatsaR
fonte

Respostas:

10
user@osx:~/from$ find . -type d -exec mkdir -p ~/to/{} \;
user@osx:~/from$ find . -type f -exec ln -s ~/from/{} ~/to/{} \;

ou

user@osx:~/from$ find . -type f -exec touch ~/to/{} \;
whitequark
fonte
Tanto isto como o lndir solução funcionou. Eu "aceitei" isso porque o lndir vem com o X e pode ir embora ou não estar presente em um sistema. Se você tiver o lndir, é mais fácil de usar.
ShreevatsaR
5 anos ainda funciona. Eu não tenho sido um usuário sério de linha de comando Unix por mais de 15 anos, então isso traz de volta ótimas memórias (dor :-)
Mark Levison
7

Experimentar lndir. De sua página de manual:

The lndir program makes  a  shadow  copy  todir  of  a  directory  tree
fromdir,  except  that  the shadow is not populated with real files but
instead with symbolic links pointing at the real files in  the  fromdir
directory tree.
Doug Harris
fonte
Isso é mágica do OS X!
whitequark
Uau, isso seria exatamente o que eu quero. Está em / usr / X11 por algum motivo (a manpage também está listada em X). Por alguma razão, quando eu corro, gosto lndir dir1 dir2, Eu recebo dir1: No such file or directory.
ShreevatsaR
Oh, conserte. A manpage diz The fromdir argument […] is relative to todir (not the current directory). Então, se você tem dir1 e dir2 no diretório atual, você tem que digitar lndir ../dir1 dir2. Naturalmente, digitar o caminho completo para dir1 também funciona. Obrigado novamente.
ShreevatsaR
4

Outra solução que funciona para mim é usar rsync e excluir todos os arquivos, por exemplo

$ rsync -a /path/from/ /path/to/ --include \*/ --exclude \*

o --include \*/ especifica que todos os diretórios devem ser copiados e --exclude \* especifica que todos os arquivos devem ser excluídos da cópia.

A beleza disso é que a nova hierarquia de diretórios possui os mesmos atributos, registros de data e hora, permissões, etc. como o original.

Paul R
fonte
1
Eu concordo, ter os atributos certos é ótimo. Você sabe se pode fazer algo sobre os arquivos, para que eles existam (como arquivos vazios ou links simbólicos)?
ShreevatsaR
Desculpe - perdi essa parte da primeira vez - pode ser possível com o rsync, mas vou precisar pensar um pouco mais.
Paul R
1

Aqui está mais uma variação do rsync método, que manterá os ícones de pasta e marcadores de localização:

rsync -Ea /path/from/ /path/to/ --include="*/"  --include="Icon*" --exclude="*"

Isso não copia aliases de arquivos, então você pode querer combiná-lo com a resposta do whitequark acima.

AAGD
fonte
0

Isto irá encontrar os diretórios dentro temp, remova o líder / home / bryan / deles e crie os novos diretórios

  for i in `find /home/bryan/temp -type d| sed 's/\/home\/bryan\///g'`
  do mkdir $i
  done

Eu sugiro digitar o código uma linha de cada vez (desta forma, ponto e vírgula (não mostrado) será colocado corretamente)

bryan
fonte