Respostas:
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.
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.
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.