Você pode fazer isso usando a -T
opção em cp
.
Consulte a página do manual para cp
.
-T, --no-target-directory
treat DEST as a normal file
Portanto, de acordo com seu exemplo, a seguir está a estrutura do arquivo.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Você pode ver a diferença clara quando você usa -v
para Verbose.
Quando você usa apenas a -R
opção.
$ cp -Rv foo/ bar/
`foo/' -> `bar/foo'
`foo/b' -> `bar/foo/b'
`foo/a' -> `bar/foo/a'
$ tree
|-- bar
| |-- a
| |-- b
| `-- foo
| |-- a
| `-- b
`-- foo
|-- a
`-- b
3 directories, 6 files
Quando você usa a opção, -T
ela sobrescreve o conteúdo, tratando o destino como um arquivo normal e não como um diretório .
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Isso deve resolver seu problema.
bar/
), mas não na origem (foo/
) serão deixados em vigor, portanto, isso não é o que a maioria das pessoas consideraria uma substituição completa do diretório. ie. sebar/baz
já existisse, ainda existiria depois ...rm -rf bar/* && cp -TRv foo/ bar/
Faça isso em duas etapas.
fonte
bar
conteúdo seja idêntico afoo
, e não uma combinação de itens defoo
mais outros itens que possam já existir embar
. A resposta altamente votada por @Saurabh Meshram abaixo tem esse problema.rm -rf bar/; cp -r foo/ !$
foo
ebar
forem grandes diretórios ... talvez haja arquivosbar
que não estão dentro efoo
que você não deseja remover. Esta não deve ser considerada uma resposta realista imhoSe você deseja garantir que
bar/
termina idêntico afoo/
, use em seursync
lugar:Se apenas algumas coisas mudaram, isso será executado muito mais rápido do que remover e copiar todo o diretório.
-a
é o 'modo de arquivo', que copia arquivos fielmentefoo/
parabar/
--delete
remove arquivos extras não nafoo/
debar/
bem, garantindobar/
acaba idênticos-vh
para verboso e legívelfoo
é necessária, caso contrário,rsync
será copiadofoo/
embar/foo/
vez de sobrescritobar/
.foo/
no conteúdo debar/
, nós use uma barra em ambos. É confuso porque não funcionará como esperado com uma barra em nenhum ; rsync sorrateiramente sempre interpreta o caminho de destino como se tivesse uma barra, embora respeite a ausência de uma barra na origem caminho. Portanto, precisamos de uma barra no caminho de origem para que corresponda à barra adicionada automaticamente no caminho de destino, se quisermos copiar o conteúdo defoo/
parabar/
, em vez do diretóriofoo/
pousando embar/
comobar/foo
.)rsync
é muito poderoso e útil, se você estiver curioso, procure o que mais ele pode fazer (como copiar sobre ssh).fonte
cp -T
opção porque também funciona em macosx 👍Use este
cp
comando:fonte
cp
comando deve remover o arquivo da fonte?O seguinte comando garante que dotfiles (arquivos ocultos) sejam incluídos na cópia:
fonte
.
significa todos os arquivos do diretório. Então, naturalmente, os arquivos ocultos seriam incluídos.Muito semelhante a @Jonathan Wheeler:
Se você não quer lembrar, mas não reescrever
bar
:!$
exibe o último argumento do comando anterior.fonte
isso deve resolver seu problema.
fonte
A operação que você definiu é uma "fusão" e você não pode fazer isso com ela
cp
. No entanto, se você não estiver procurando por mesclagem ebar
puder perder a pasta , bastarm -rf bar
excluir a pasta emv foo bar
renomeá-la. Isso não levará nenhum tempo, pois ambas as operações são feitas por ponteiros de arquivo, não pelo conteúdo do arquivo.fonte
Tente usar este comando composto de duas etapas:
fonte