Eu tenho uma tonelada de arquivos e diretórios em um subdiretório que desejo mover para o diretório pai. Já existem alguns arquivos e diretórios no diretório de destino que precisam ser substituídos. Os arquivos presentes apenas no destino devem ser mantidos intactos. Posso forçar mv
a fazer isso? ( mv * ..
) Reclama
mv: cannot move `xyz' to `../xyz': Directory not empty
o que estou perdendo?
shell
command-line
rename
EricSchaefer
fonte
fonte
mv -f
?mv -f
a resposta não está correta.Respostas:
Você precisará copiá-los para o destino e excluir a fonte, usando os comandos
cp -r * ..
seguidos porrm -rf *
.Eu não acho que você pode "mesclar" diretórios usando
mv
.fonte
mv
é mais rápido porque você está no mesmo sistema de arquivos? E se você usarcp -l
para criar hardlinks em vez de realmente mover os arquivos?cp -a
vez decp -r
para preservar os atributos do arquivo (registro de data e hora, permissões etc.).cp -rl source destination && rm -r source
.rsync
provavelmente seria uma opção melhor aqui. É tão simples quantorsync -a subdir/ ./
.Minha árvore de teste em
filename
:contents
formato:Em execução
rsync
:Dá:
E então, para emular
mv
, você provavelmente deseja remover o diretório de origem:Dando:
Se isso estiver errado, você pode fornecer um exemplo semelhante (por exemplo, usando minha árvore de teste perto do topo desta resposta) com o resultado desejado?
fonte
rm -r
no final para torná-lo basicamente o mesmo quemv
.mv
é atômico, preserva os números de inode (para que o arquivo possa permanecer aberto) e não leva tempo e espaço para fazer uma cópia.cp -r; rm -r
. Eu acho que nesse sentido,rsync
vale a pena mencionar também.rsync
pode excluir a fonte após as cópias com o--remove-source-files
parâmetro Essa deve ser uma maneira conveniente de fazer o que você deseja.De
rsync man page
:fonte
cp -r; rm
por falta de espaço livre. Em vez disso,rsync --remove-source-files
o espaço em disco usado minimizado evitou a cópia exatamente dos mesmos arquivos.Você pode fazer isso com
cp
erm
, mas sem copiar a enorme quantidade de dados que você está (presumivelmente) tentando evitar a transferência. @mattdm fez alusão a isso em seu comentário , e uma resposta para outra pergunta tem uma discussão mais completa sobre várias opções.Essencialmente, a
-l
opção para ocp
comando cria links físicos para arquivos em vez de copiar seus dados para novos arquivos.fonte
cp -al source destination
para preservar informações e permissões do proprietário.cp
sobrescreve por padrão. A-f
opção tenta remover o arquivo (como emrm
) antes de tentar copiar novamente, o que pode ajudar se o processo não puder abrir o arquivo para gravação, embora algumas pessoas prefiram ver que houve um erro. Não sei se isso importava para o OP, mas adicionei a-f
bandeira à minha resposta de qualquer maneira.Aqui está um script que move os arquivos de baixo
/path/to/source/root
para o caminho correspondente em/path/to/destination/root
.Cuidado, código não testado.
fonte
\;
antes do-o
na primeira linha dofind
comando, e você não deve escapar!
noif
- é apenas!
, não\!
Esta discussão está lá fora há anos e ainda está no 1º lugar no google, então eu queria adicionar outro método. Como eu costumo fazer isso: empacotar o conteúdo subdir em um tarball, movendo o tarball para o diretório pai e depois extraí-lo com o comportamento padrão - overwrite. Isso faz exatamente o que você está procurando. Depois, você pode remover seu subdiretório.
fonte
Se você tiver armazenamento suficiente, poderá fazê-lo da seguinte maneira:
Verifique se não há arquivos importantes com um ~ no final deles, mas se houver, você pode adicionar em
--suffix=whateveryouwant
vez do padrão.fonte