Copie arquivos de um diretório para um diretório existente

248

No bash, preciso fazer o seguinte:

  1. pegue todos os arquivos em um diretório

  2. copie-os para um diretório existente

Como eu faço isso? Eu tentei cp -r t1 t2(t1 e t2 são diretórios existentes, t1 tem arquivos), mas ele criou um diretório chamado t1 dentro de t2, não quero isso, preciso que os arquivos em t1 sejam diretamente dentro de t2. Como eu faço isso?

David Chang
fonte
11
Por que isso foi fechado? É arbitrário se um comando bash é um comando interno ou externo (por exemplo, printf existe como ambos na maioria dos sistemas), portanto, as cpperguntas podem ser vistas como bashperguntas, que é uma linguagem de programação. Eu nunca vi uma pergunta Python falando sobre cópia de arquivo ser fechada.
Ciro Santilli # 9/14
Dê uma olhada neste stackoverflow.com/questions/23698183/...
theGiallo
Cheguei em busca de um lembrete sobre a sintaxe do comando Bash shell copy, e fico feliz em informar que esses comandos também parecem funcionar no sistema de arquivos NTFS subjacente na instalação do Windows.
David A. Gray

Respostas:

396

O que você quer é:

cp -R t1/. t2/

O ponto no final diz para copiar o conteúdo do diretório atual, não o diretório em si. Este método também inclui arquivos e pastas ocultos.

usuario
fonte
2
Eu realmente gosto dessa sintaxe, mas por algum motivo ela não funciona mv. Alguem sabe por quê?
Martin von Wittich
2
Surpreendente. Onde isso está documentado? É POSIX ou extensão?
Ciro Santilli escreveu
9
@CiroSantilli Se você copiar um diretório, o cp criará um diretório e copiará todos os arquivos nele. Se você usar a pasta fingida chamada ".", Que é igual ao diretório que a contém, a cópia se comportará dessa maneira. Digamos que t1 contenha um arquivo chamado "arquivo". O cp executará a operação equivalente a "cp t1 /./ arquivo t2 /./". Ele está copiando a pasta ".", Mas copiando arquivos para os "." De t2 pasta remove "./" porque "t2 /./" é igual a "t2 /". Tecnicamente, isso significa que é um comportamento POSIX integrado ... mas provavelmente não da maneira que você esperava!
marcando
35

Se você deseja copiar algo de um diretório para o diretório atual , faça o seguinte:

cp dir1/* .

Isso pressupõe que você não está tentando copiar arquivos ocultos.

Karl Giesing
fonte
20
Perde arquivos ocultos.
Ciro Santilli escreveu
1
Também falha em um grande número de arquivos (porque '*' não pode ser expandido para um número infinito de arquivos ..) y
moritzschaefer
32
cp dir1/* dir2

Ou se você possui diretórios dentro do dir1 que também deseja copiar

cp -r dir1/* dir2
Bertrand Marron
fonte
3
Dependendo de como o seu shell estiver configurado, você provavelmente precisará usar "dir1 / * dir1 /.*" em vez de "dir1 / *" se desejar também capturar arquivos ocultos.
Ssokolow 04/04/10
2
Copiar dir1/.*não é uma boa ideia, pois copia dir1 / .. (ou seja, o pai do diretório que você está realmente tentando copiar). Ele também copia dir1 /. o que é bom, exceto que já foi (na maioria das vezes) copiado, então você está fazendo o trabalho duas vezes.
Gordon Davisson
1
Você pode contornar o dir1/.*problema / arquivos ocultos, digitando o CD no diretório do qual deseja copiar e consultando-o como .. Portanto, se você deseja copiar todos os arquivos, incluindo arquivos ocultos de um diretório para um diretório existente, é possível: cd [source dir], cp . [path to destination dir, with no trailing slash].
RobW
8

Supondo que t1 seja a pasta com arquivos e t2 seja o diretório vazio. O que você quer é algo como isto:

sudo cp -R t1/* t2/

Lembre-se de que, para o primeiro exemplo, t1 e t2 devem ser os caminhos completos ou relativos (com base em onde você está). Se desejar, você pode navegar para a pasta vazia (t2) e fazer o seguinte:

sudo cp -R t1/* ./

Ou você pode navegar para a pasta com arquivos (t1) e fazer o seguinte:

sudo cp -R ./* t2/

Nota: O sinal * (ou curinga) significa todos os arquivos e pastas. O sinalizador -R significa recursivamente (tudo dentro de tudo).

Konkret
fonte
2
cp -R t1/ t2

A barra final no diretório de origem altera ligeiramente a semântica, de modo que copia o conteúdo, mas não o próprio diretório. Também evita os problemas com arquivos ocultos e invisíveis que a resposta de Bertrand tem (copiar t1/*arquivos invisíveis, copiar `t1 / * t1 /.* 'copia t1 / .t1 / .., que você não deseja).

Gordon Davisson
fonte
Sua solução não funcionar, pelo menos não na minha instalação (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (desculpe não codeformat nos comentários, versão legível em pastebin.com/yszSxV6G )
zpon
2

Dependendo de alguns detalhes, pode ser necessário fazer algo assim:

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

... isso basicamente muda para o diretório SRC e o copia para o destino, depois retorna para onde você começou.

A confusão extra é lidar com alvos relativos ou absolutos.

(Isso não depende da semântica sutil do cppróprio comando ... sobre como ele lida com as especificações de origem com ou sem um final / / ... já que não tenho certeza de que sejam estáveis, portáteis e confiáveis, além do GNU cpe I não sei se continuarão assim no futuro).

Jim Dennis
fonte
1

Para dentro de algum diretório, isso será usado full, pois ele copia todo o conteúdo de "folder1" para o novo diretório "folder2" dentro de algum diretório.

$ (pwd) obterá o caminho para o diretório atual.

Observe o ponto (.) Após a pasta1 para obter todo o conteúdo dentro da pasta1

cp -r $(pwd)/folder1/. $(pwd)/folder2
Bidyashish Kumar
fonte