Como copiar o arquivo preservando o caminho do diretório no Linux?

72

Eu tenho projetos Eclipse e arquivo ".project" neles, a estrutura de diretório se parece com ' myProject/.project '. Eu quero copiar esses arquivos '.project' para outro diretório, mas eu quero que o nome do diretório envolvente seja preservado.

Digamos que eu tenha ' a/myProject/.project ', desejo copiar ' myProject/.project ' para ' b ', portanto, ' b/myProject/.project ', mas ' b/myProject ' não existe. Quando tento em um:

 cp -r ./myProject/.project ../b

copia apenas o arquivo '.project', sem o diretório 'myProject'. Por favor, informe.

    
por dhblah 14.09.2010 / 09:52

9 respostas

130

A opção de que você precisa é --parents , por exemplo:

jim@prometheus:~$ cp --parents test/1/.moo test2/
jim@prometheus:~$ ls -la test2/
total 42
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 .
drwxr-xr-x 356 jim jim 43136 2010-09-14 09:32 ..
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 test
jim@prometheus:~$ ls -la test2/test/1/.moo
-rw-r--r-- 1 jim jim 0 2010-09-14 09:32 test2/test/1/.moo
    
por 14.09.2010 / 10:34
13

Você também pode usar rsync -R , que funciona no OSX, no qual cp --parents não está disponível.

link

    
por 24.12.2015 / 06:22
6

Use tar com algo como:

mkdir b; tar cpf - myProject/ | tar xpf - -C b/

(Não testado. Faça um teste primeiro ou experimente um cenário de maquete.)

    
por 14.09.2010 / 10:39
4

Primeiro, use mkdir -p para criar a pasta de destino com a criação do caminho pai recursivo. Em seguida, copie o conteúdo para a pasta de destino:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
    
por 03.06.2012 / 00:59
3
cp -P a/myProject/.project b

Veja man cp para mais informações.

    
por 14.09.2010 / 10:06
2

Eu uso o cpio em combinação com o find. Explicação aqui .

Exemplo para o seu caso de uso:

find /a/myProject/.project/ -type f | cpio -p -dumv /b/.

Este comando encontra todos os arquivos em /a/myProject/.project/ e cópias, preservando o caminho, quaisquer arquivos contidos nele.

    
por 17.03.2015 / 10:40
1

Além de --parents , também é necessário adicionar a opção -r para evitar a omissão da cópia da maioria dos diretórios internos

$ cp --parents test/1/.moo test2/
cp: omitting directory ‘test/1/.moo’

Então o comando que funciona para mim é

$ cp --parents -r test/1/.moo test2/
    
por 29.07.2016 / 21:59
0

Por favor, esteja ciente de que parece haver um erro em cp --parents . Quando eu usei --parents juntamente com --preserve=all , os atributos de data e hora de SOME os diretórios de destino não foram preservados.

O link a seguir parece confirmar que isso é um bug: bug # 8767 : cp: --preserve = tudo não funciona para os pais quando --parent é usado .

Portanto, parece que você não pode confiar em atributos preservados ao usar --parents junto com --preserve=all ou -p .

    
por 15.10.2016 / 13:38
-3

Eu usei --parents com o comando cp e trabalhei perfeitamente comigo. Para mais detalhes, use sempre o manual. Obrigado.

    
por 15.05.2015 / 09:44