'mv' equivalente de arrastar e soltar com substituir?

19

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

user7089
fonte

Respostas:

20

Não com mv.

A principal função mv(apesar do nome) é renomear um objeto. Uma das garantias que o UNIX faz é que as renomeações sejam atômicas - você nunca poderá ver uma renomeação parcialmente concluída. Essa garantia pode ser muito útil se você desejar alterar um arquivo ( /etc/passwdpor exemplo) que outros programas possam estar visualizando e desejar que eles vejam a versão antiga ou nova do arquivo e nenhuma outra possibilidade . Mas uma "renomeação recursiva", como você descreve, quebraria essa garantia - você poderia interrompê-la no meio e teria uma árvore meio movida e provavelmente uma bagunça - e, portanto, não se encaixaria na filosofia de mv. Esse é o meu palpite sobre o porquê mv -rnão existe.

(Não importa que isso mvquebre essa filosofia de outras maneiras menores. Por exemplo, mvna verdade , ele é cpseguido por rmao mover arquivos de um sistema de arquivos para outro.)

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

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

A -lsinalização para cpsignifica "criar um link físico em vez de copiar" - está efetivamente criando um novo nome de arquivo que aponta para os mesmos dados do arquivo antigo. Porém, isso funciona apenas 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.

Os &&meios "somente executam o seguinte comando se o comando anterior tiver êxito". Se desejar, você pode executar os dois comandos, um de cada vez.

Jander
fonte
Extremamente informativo. Muito obrigado!
User7089 24/04
4

Não acho que você possa replicar o comportamento de arrastar e soltar com o qual está descrevendo mv, pois os subdiretórios não vazios no destino não serão substituídos.

Talvez rsync? Algo como rsync -a -r source/ target/? Execute com o -v -npara executar um teste seco detalhado primeiro para garantir que ele faça o que você deseja.

cjc
fonte
3

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

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

E substituirá arquivos e diretórios existentes.

Tim
fonte
2
Somente diretórios vazios
Kevin
1

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

https://github.com/iaindooley/pickdrop

Exemplo:

diga que tenho:

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

e quero mover essas coisas para / site

assim 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

Isso é literalmente recortar e colar.

testador
fonte
Muito legal e definitivamente vale a pena investigar. No entanto, a pergunta era especificamente sobre 'mv', então acho que deixarei a resposta correta como a que explica a filosofia por trás de mv em detalhes. Obrigado por esta contribuição, definitivamente, muito útil.
User7089 25/05
Também digno de nota, no leia-me: "Não é nada robusto - ele armazena suas escolhas em ~ / .pick até você chamar drop, quando usa os caminhos de arquivo em ~ / .pick para criar um novo arquivo executável ~ / .drop para copiar cada um dos arquivos que você selecionou no diretório de trabalho atual ".
User7089