Como copiar arquivos mantendo a estrutura de diretórios?

0

Isso é para um projeto java, mas o mesmo conceito pode ser aplicado de maneira mais geral:

Basicamente, tenho projetos com todos os arquivos *.java localizados em algum subdiretório de src . Agora quero pegar todos os diretórios com o nome test nessa árvore de diretórios e movê-los para um novo diretório chamado tests , por exemplo:

src->com->a1
          -> A.java
          -> B.java
          -> test
              -> test1.java
              -> test2.java

para

src->com->a1
          -> A.java
          -> B.java
tests->com->a1->test
                -> test1.java
                -> test2.java

Como eu faria melhor isso?

    
por Cubic 17.12.2012 / 17:20

3 respostas

1

Você precisará escrever um script de shell para esta tarefa. Vou tentar e comentar as linhas.

A primeira linha aqui é apenas uma variável onde você coloca o diretório absoluto da sua árvore src .

SRCDIR=/dir/where/src/lives

A próxima linha executa find . O comando colocará cada caminho de diretório com o nome test na variável TESTDIRS .

TESTDIRS=$(find $SRCDIR -type d -name test)

Agora você itera todos os diretórios test encontrados

for dir in $TESTDIRS; do

Isso leva o caminho real e remove tudo, inclusive src . Então você obtém a estrutura para criar o novo caminho.

  NEWDIR=${dir##*/src}

Agora crie os novos diretórios.

  mkdir -p tests/$NEWDIR

Mova o antigo diretório test para o local recém-criado.

  mv $dir tests/$NEWDIR

encerre a iteração

done

Tanto quanto eu entendo você isso deveria ser o que você quer. Mas por favor teste primeiro. Pode haver algumas ressalvas e a execução do script pode levar à perda de dados.

    
por qbi 18.12.2012 / 09:02
0

Por favor, note que os significados do movimento mv e da cópia cp são distintos e bem definidos para o uso do terminal. mv significa que os arquivos não existirão mais no local antigo, enquanto cp significa que uma duplicata é feita no novo local.

Solução simples (observe que eu uso mv , mas você pode querer usar cp primeiro e depois remover os arquivos antigos assim que a cópia for o que você quer):

cp src/com/a1/test/test*.java tests/com/a1/test/

Solução mais elegante (este move os arquivos, não as cópias):

cd src/com/
find . -iname "test*.java" -type d -exec mv {} ../../tests/com/ \;

Se a segunda solução não funcionar para o seu caso de teste específico, podemos iterar ...

    
por philshem 17.12.2012 / 18:21
0

Eu uso um desses comandos para copiar todos os meus arquivos jpg e pular todos os arquivos db, raw etc. Qualquer um deve trabalhar para as suas necessidades.

Usando rsync :

 rsync -a --prune-empty-dirs --include '*/' --include '*.jps' --exclude '*'  source/ target/

Ou find com exec :

find . -name '*.jpg' -exec cp --parents \{\} /target \;
    
por km1 16.06.2015 / 19:05