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/passwd
por 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 -r
não existe.
(Não importa que isso mv
quebre essa filosofia de outras maneiras menores. Por exemplo, mv
na verdade , ele é cp
seguido por rm
ao 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 mv
seguinte forma (por exemplo):
cp -al source/* dest/ && rm -r source/*
A -l
sinalização para 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 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 -n
para 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.