Eu gostaria de copiar um conteúdo do diretório 1 para o diretório 2. No entanto, gostaria de copiar apenas arquivos (e não diretórios) do meu diretório 1. Como posso fazer isso?
cp dir1/* dir2/*
então ainda tenho o problema de diretórios.
Além disso, todos os meus arquivos não têm nenhuma extensão . não vai fazer o truque
cp dir1/* dir2
oucp -t dir2 dir1/*
Respostas:
cp
não copiará diretórios, a menos que seja explicitamente instruído a fazê-lo (com,--recursive
por exemplo, consulteman cp
).Nota 1:
cp
provavelmente sairá com um status diferente de zero, mas os arquivos serão copiados de qualquer maneira. Isso pode ser um problema quando o encadeamento de comandos com base em códigos de saída:&&
,||
,if cp -r dir1/* dir2; then ...
, etc. (graças a contrebis para o seu comentário sobre essa questão )Nota 2 :
cp
espera que o último parâmetro seja um único nome ou diretório de arquivo. Realmente não deve haver curinga*
após o nome do diretório de destino.dir2\*
será expandido pelo shell exatamente comodir1\*
. Coisas inesperadas vão acontecer:dir2
estiver vazio e dependendo do seu shell e configurações:dir2/*
será levado literalmente (procurando um arquivo / diretório chamado*
), o que provavelmente também levará a um erro, a menos*
que exista realmente.dir2/*
será apenas removido completamente do comando, saindocp dir1/*
. Que, dependendo da expansão dedir1/*
, pode até destruir dados:dir1/*
corresponder apenas a um arquivo ou diretório, você receberá um errocp
.dir1/*
corresponder exatamente a dois arquivos, um será substituído pelo outro ( Ruim ).dir/*
corresponder a vários arquivos e a última correspondência for a, você receberá uma mensagem de erro.dir/*
for um diretório, todas as outras correspondências serão movidas para ele.dir2
não estiver vazio, depende novamente:dir2/*
for um diretório,dir1/*
e as outras correspondências dedir2/*
serão movidas para.dir2/*
for um arquivo, você provavelmente receberá uma mensagem de erro, a menos quedir1/*
corresponda apenas a um arquivo.fonte
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
sai com o status 1 para mim.cp
copia os arquivos correspondentesdir1/*
em todos os sistemas que verifiquei: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 e 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 e 10 (ondecp
realmente sai com o código 2). Portanto, esse comportamento não é novo (o SuSE 8.1 é de 2002) nem é limitado ao Linux.cp
sai com um código de saída diferente de zero porque não pôde fazer tudo o que foi solicitado. Isso não significa que não faz nada .&&
isso pode causar um problema. Eu estava tentando algo assim, embora não me lembre do contexto agora.*
arquivos ocultos ou como incluir arquivos ocultos depende do shell. Se o*
arquivo não incluir arquivos ocultos, você poderá combiná-los.*
. Observe que isso incluirá.
e..
ativarábash
edash
não ativarázsh
. No contexto desta resposta, você pode se safarcp dir1/* dir1/.* dir2
porque.
e..
são diretórios e não serão copiados.zsh
Também pode ser feito para incluir arquivos ocultos com*(D)
.É o shell que expande curingas, não os comandos. Então,
cp dir1/* dir2/*
primeiro expanda os dois curingas, depois chamecp
o resultado. Aparentemente, isso não é o que você espera: dependendo de quantos arquivos já existemdir2
, vocêdir2/*
pode expandir para um ou mais argumentos. O comandocp
não sabe quais argumentos vieram da expansão do primeiro padrão e quais vieram da expansão do segundo padrão. Ele espera que seu último argumento seja o nome do diretório de destino. Portanto, para copiar todos os arquivos do diretóriodir1
para o diretóriodir2
, o último argumento deve ser o diretóriodir2
:Como
*
corresponde a todos os arquivos,cp
tenta copiar todos os arquivos. Isso inclui diretórios: diretórios também são arquivos. Ignora diretórios, mas relata um erro. Ele copia o conteúdo de arquivos especiais, como pipes nomeados (é melhor que algo esteja gravando neles, oucp
bloqueará), etc.Para copiar apenas arquivos regulares , você precisa restringir a correspondência. No zsh, você pode usar o qualificador glob
.
para isso:Outras conchas não têm isso. Você pode usar o
find
comando para filtrar os tipos de arquivo. Supondo que você esteja executando Linux ou Cygwin não incorporado:No Linux, FreeBSD e OSX:
fonte
-maxdepth 1
. Além disso, existe uma maneira de copiar e preservar recursivamente a hierarquia de diretórios original no diretório de destino?-maxdepth 1
, ofind
comando recursaria em subdiretórios, o que não era desejado aqui. Se você deseja copiar toda a árvore de diretórios incluindo subdiretórios, é uma questão completamente diferente, ea resposta é muito mais simples:cp -a dir1 dir2
.Abaixo está o comando para copiar o arquivo do diretório de origem para o de destino.
Vá para a pasta de origem e escreva o comando abaixo:
$ cp fileName destination directory path
Exemplo:
fonte