Comecei a usar o BASH, para poder mover todo o conteúdo de um diretório para outro. Mas o problema é que eu esperava que ele mesclasse os diretórios. Estou usando o cron job para executar este script.
#!/bin/bash
shopt -s dotglob nullglob
mv mv_schedule/* public_html/
Fonte: /mv_schedule/
(contendo pastas / arquivos)
/files/
4.html
5.html
/assets/
sitemap.xml
Destino: /public_html/
(as pastas anteriores já existem)
/files/
1.html
2.html
3.html
/assets/
sitemap.xml
Então, o que eu quero é que todos os novos arquivos desses diretórios /mv_schedule/
sejam mesclados com os existentes /public_html/
e que os arquivos que já existem nele sejam substituídos pelos que vierem /mv_schedule/
.
No momento, ele está retornando esse erro por e-mail quando tento isso com o script atual:
mv: cannot move `mv_schedule/assets' to `public_html/assets': Directory not empty
Como posso consertar isso?
alias -a
/Respostas:
O que a mensagem de erro está dizendo é que ela não pode mv o diretório de ativos porque há arquivos dentro dele. mv um diretório significa fazer uma cópia, depois apagá-la e não pode apagá-la porque ainda contém alguns arquivos. Isso significa que você também deve mover os arquivos dentro do ativo e até os subdiretórios e arquivos nos subdiretórios do ativo, se eles existirem. Mas o comando mv emitido pode apenas copiar (e apagar) o que está presente no diretório mv_schedule, não o que está presente nos subdiretórios (como ativo) dentro do mv_schedule.
O que você deseja é um comando que desça a árvore de diretórios até a última folha e a copie, algo como uma opção -r ou -R em rm, chmod, chown. No entanto, o mv não possui essa opção; portanto, você terá que usar o comando find, que desce toda a árvore de diretórios de uma raiz especificada e, em seguida, executa uma ação especificada. No seu caso, um comando adequado é:
Isso empilhará todos os arquivos em um único diretório de destino. Ele pressupõe que você passou o diretório de origem e destino como parâmetros da linha de entrada para um script bash. A opção -f impede a solicitação de confirmação em caso de substituição, você pode alterá-la para -n (não substitui) ou -i (perguntar antes de substituir).
Se, em vez disso, você deseja preservar a estrutura de diretórios, lembre-se de que o comando cp tem a capacidade de descer a árvore de diretórios, para que você possa usá-lo, seguido por uma rm, pois esse comando também tem a capacidade de descer árvores. Um conjunto possível de comandos é:
Observe a opção -a no cp: preserva registros de data e hora e propriedades. Se você não se importa com essas coisas, pode usar -R.
fonte
SOURCE_DIR
eTARGET_DIR
comdirName/
? Além disso, vejo que você mencionou -i (pergunte antes de sobrescrever). Quero que ele substitua os arquivos existentes e mescle com os diretórios existentes, para manter todos os arquivos existentes no diretório de destino e adicionar (também substituir arquivos existentes) os novos do mesmo diretório de nome da origem.rm -rf $SOURCE_DIR
irá remover o diretório de origem, talvez seja melhor para preservá-lo e utilizaçãorm -rf "$SOURCE_DIR/*"
- Também é aconselhável usar aspas em torno de variáveis (em nomes de diretório caso ter espaços)/mv_schedule/, not the directory
/ mv_schedule / `em si.Há uma discussão mais genérica sobre esse problema na seção Unix.
Você pode usar a
-l
opção do comando cp , que cria links físicos de arquivos no mesmo sistema de arquivos em vez de cópias de dados completos. O comando a seguir copia a pastasource/folder
para uma pasta pai (destination
) que já contém um diretório com o nomefolder
.Notas:
-P
(--no-dereference
- não desassociar links simbólicos) ou-a
(--archive
- preservar todos os metadados, também inclui a-P
opção), dependendo de suas necessidades.-l
solução baseada em cp (sans ) ou rsync.fonte
Excelente resposta de palswim. (Além disso, obrigado pelo voto positivo pelos dois últimos pontos necessários para que eu pudesse votar novamente!)
O cp -rl; A rm resolve o problema e com o mínimo de E / S (cp e rsync são estupidamente caros nesse sentido).
Existem dois problemas menores:
fonte