'mv' equivalente a arrastar e soltar com substituir?

19

Em um ambiente GUI, um método de arrastar e soltar com substituição substituirá os arquivos e diretórios inteiros (incluindo o conteúdo) pelo que estiver sendo copiado. Existe uma maneira de realizar esse mesmo resultado intuitivo com o comando 'mv'?

    
por user7089 23.05.2012 / 21:49

4 respostas

20

Não com mv .

A função principal de mv (apesar de seu nome) é renomear um objeto. Uma das garantias que o UNIX faz é que as renomeações são atômicas - você nunca tem permissão para ver uma renomeação parcialmente concluída. Esta garantia pode ser muito útil se você quiser alterar um arquivo ( /etc/passwd , por exemplo) que outros programas possam estar olhando, e você quer que eles vejam a versão antiga ou nova do arquivo, e não outra possibilidade . Mas uma "renomeação recursiva" como você descreve quebraria essa garantia - você poderia parar no meio e você teria uma árvore meio movida e provavelmente uma bagunça - e assim ela não se encaixa na filosofia de mv . Esse é o meu palpite a respeito de porque mv -r não existe.

(Não importa que mv quebra essa filosofia de outras formas menores. Por exemplo, mv na verdade faz um cp seguido por rm ao mover arquivos de um sistema de arquivos para outro.)

Bastante filosofia. Se você quiser recursivamente mover ("arrastar e soltar") uma árvore de um lugar para outro no mesmo sistema de arquivos , você pode obter a eficiência e a velocidade de mv da seguinte forma (por exemplo):

cp -al source/* dest/ && rm -r source/*

O sinal -l to cp significa "criar um link físico em vez de copiar" - está efetivamente criando um novo nome de arquivo que aponta para os mesmos dados de arquivo que o nome do arquivo antigo. Isso só funciona em sistemas de arquivos que suportam links físicos, portanto, qualquer sistema de arquivos UNIX-ish nativo é bom, mas não funciona com o FAT.

O && significa "apenas execute o seguinte comando se o comando precedente for bem-sucedido". Se você quiser, pode executar os dois comandos, um de cada vez.

    
por 24.05.2012 / 08:53
4

Eu não acho que você possa replicar o comportamento de arrastar e soltar que está descrevendo com mv , já que subdiretórios não vazios no alvo não serão substituídos.

Talvez rsync ? Algo parecido com rsync -a -r source/ target/ ? Corra com o -v -n para fazer uma primeira execução detalhada para garantir que ela faça o que você deseja.

    
por 23.05.2012 / 22:32
3

mv -f /path/to/source/folder/* /destination/folder/

Move tudo em / path / to / source / folder, incluindo arquivos e diretórios para / destination / folder.

E sobrescreverá arquivos e diretórios existentes.

    
por 23.05.2012 / 22:04
1

Você provavelmente vai querer mudar a resposta correta para isso:

link

Exemplo:

diga que tenho:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

e eu quero mover essas coisas para / site

, então parece:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

Eu posso ir:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

Isto é literalmente cortado & colar.

    
por 24.05.2012 / 22:00