mv: Diretório não vazio

155

Quero mover o conteúdo de um diretório dentro de outro diretório com as mesmas pastas.

Aqui está um exemplo:

Eu tenho os ./backupquais têm os diretórios basee test. Agora eu quero mover esses diretórios ./backupArchives.

Eu uso isso:

mv ./backup/* ./backupArchives

mas eu entendi o erro

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

Eu tentei usar --force, mas sem sorte. Existe uma maneira de movê-lo quando as pastas já existem?

Nota: Eu só quero mesclar o conteúdo, não há substituição.

UdK
fonte
Você está apenas tentando mesclar o conteúdo das pastas no destino ou está tentando substituir o conteúdo do destino. (também ajuda se você tiver o erro INTEIRO, sem usar ...... para truncar dados)
Thomas Ward
Eu só quero mesclar o conteúdo, não há substituição.
UdK
2
@UdK Mesmo que isso funcione, observe que isso não mesclaria o conteúdo dos dois diretórios. Mover um diretório substituirá seu destino. Dê uma olhada em rsyncvez disso, ele fará a fusão.
Zwets 19/03/2013

Respostas:

188

Embora sua página de manual não o documente, ela mvse recusará a renomear um diretório para outro diretório se o diretório de destino contiver arquivos. Isso é bom no seu caso, porque você deseja mesclar o conteúdo da fonte no destino, o que mvnão funciona.

Use em rsync -a backup/ backupArchives/vez disso. Depois disso rm -rf backup/*.

Em vez de usar rsync, você também pode fazer o clássico

(cd backup && tar c .) | (cd backupArchives && tar xf -)

o que lhe dá mais pontos de geek.

zwets
fonte
4
coisas boas para saber! Ambos estão funcionando muito bem. Obrigado!
UdK
5
Os pontos de geek são os melhores pontos: D
MadMike
2
Observe que isso requer que você tenha o tamanho da pasta em espaço livre. E causará problemas horríveis, se não.
Pogrindis
4
@Pogrindis Explique que problemas horríveis ocorrerão e como eles são diferentes de qualquer outra tentativa de gravar em um disco completo? De fato, como ambas as operações mantêm o diretório original intacto, se a operação falhar com você simplesmente rm -rf backupArchivessem consequências, muito menos com as "horríveis".
Zwets
4
Obrigado por nomear a abordagem clássica, muito útil se o rsync não estiver disponível! Também funciona com sudo usandosudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
ArendE
39

Rápido e sujo, se você souber o que está fazendo:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
patrickvacek
fonte
3
Também funciona no meu modo de segurança, genial.
Banned_User
4

Após o diretório que você está movendo, você precisa *(representa qualquer texto ou número). Por exemplo:

mv /var/www/* /recovery/wwwrecovery/

isso é tudo, se você mover arquivos, será movido como:

mv /var/www/index.php /recovery/index.php

Outra maneira é compactar o conteúdo dessa pasta usando tar:

tar -cvzpf backup.tar.gz /var/www 

Em seguida, mova-o para qualquer outro arquivo. Também recomendo esta etapa porque o alcatrão a comprime e diminui de tamanho.

Para extrair os arquivos para outra pasta, use

tar -xvzpf /var/www/

Se você precisar copiar para um local que não é seu, lembre-se de acrescentar seu comando com o sudocomando após a opção que você decidir usar.

sudo tar -cvzpf backup.tar.gz /var/www/
Dimitris Theodoridis
fonte
Estou usando o Ubuntu 12.10 e tenho: mv: opção inválida - 'R' Tente `mv --help 'para obter mais informações. Na verdade, .tar é legal, mas preciso saber como mover meus arquivos para essa situação. Obrigado pela sua ajuda
UdK
Estou usando 12.04 desktop e servidor e em ambos funciona bem. tenha cuidado, se você não fez espaço entre folfer e -R. Eu também tentei sem -R funciona da mesma maneira para mim, tente sem -R, mas tenha cuidado com a ortografia: o linux importa letras maiúsculas e minúsculas !!! do que se o caminho estiver incorporado movendo-se ou movendo-se do local. se você não tiver a pasta que deseja mover, basta colocar -C depois dela e ela será criada. tente também primeiro: encontre -name name da sua pasta e execute este comando a partir do root, apenas para ver se ele existe em outro lugar, se você errar alguma coisa. dá-me comando exata que você usou
Dimitris Theodoridis
o que thaaa ..... colocou esse nome de arquivo entre **
Dimitris Theodoridis
1
Isso -Rcertamente não deveria ocorrer após o primeiro argumento. As opções (quase) sempre precedem os argumentos do comando. Além disso, mvnão tem -Ropção e, finalmente, a recursão é irrelevante para a mv. @DimitrisTheodoridis, teste sua resposta primeiro.
Zwets 19/03/2013
sim meu mano você está certo, eu sempre tenho problemas com a minha ortografia, e sempre tenho problemas com o terminal para isso ou comando não encontrado ou crie novos arquivos e diretórios que eu não conheço, apenas para ortografia básica ... pelo jeito que eu usei o comando cp, do que aqui escrevi mv sory para esse mano: D
Dimitris Theodoridis
4

Certamente rsyncfunciona, mas isso pode funcionar também para máquinas que não suportam rsync(ou seja, no cpanel, que o rsync não está instalado por padrão).

Que tal usar:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

Em seguida, remova o backupdiretório, se necessário

Nota1: Você precisa acessar cdo backupdiretório antes de executar ocp -R --parents ...

Nota2: verifique o backupArchivesdiretório se você obteve os novos arquivos de backup.

Atillo Regner Rex
fonte
1

Antes de fazer a pergunta, vamos considerar um caso simplificado.

Suponha que em / home / admin tenhamos duas pastas fooe barque tenham a mesma estrutura de subdiretórios, mas cada uma contém arquivos diferentes. Agora queremos mesclá-los em um. Quando fazemos coisas assim mv foo/* bar, o erro mv: directory not emptyocorre.

Minha solução é abandonar as ferramentas de linha de comando e mudar para um gerenciador de arquivos da GUI, por exemplo, dolphin. Quando você renomeia foopara barno dolphin, ele oferece a opção de gravar na pasta de destino e pergunta se você deseja substituir os arquivos existentes, interativamente. Isso evita copiar e excluir, o que economiza seu tempo sem uma única linha de código.

PS: Eu não testei todos os gerenciadores de arquivos por aí. Mas a maioria deles deve ter esse recurso.

navigaid
fonte