Você pode usar o rsync.
rsync -av --remove-source-files src/ dest/
Infelizmente, isso não removerá os diretórios. Você pode simplesmente adicionar outro comando para removê-los.
Então, vamos supor que eu tenha:
dest/dir/file1
dest/dir/file2
dest/dir/subdir/subfile1
dest/dir/subdir/subfile2
e
src/dir/file3
src/dir/subdir/subfile3
src/dir/newdir/anotherfile
... e vamos supor que existam milhares de arquivos e subdiretórios.
Agora quero mover todos os novos arquivos de src para dest, para seus respectivos diretórios, criando novos subdiretórios quando necessário. Isso seria o equivalente de " cp -a src / dir dest / ", mas como uma operação de movimentação. O comando óbvio " mv src / dir dest / " falha porque o diretório já existe no destino.
Como posso fazer isso com um comando?
Enquanto a opção rsync é melhor para simplesmente mover arquivos, aqui está outra abordagem; usando find para invocar repetidamente mv :
# First, move directories that don't exist on the destination:
(cd src/dir ; find * -type d -print) | while read f; do
[ ! -d "src/dir/$f" ] || [ -d "dest/dir/$f" ] || mv "src/dir/$f" "dest/dir/$f"
done
# Then move individual files:
(cd src/dir ; find * -type f -print0) | xargs -0 -n1 -i@ /bin/mv src/dir/@ dest/dir/@
# Alternate to the xargs usage, to allow prompting before overwriting files:
(cd src/dir ; find * -type f) | while read f; do
/bin/mv -i "src/dir/$f" "dest/dir/$f" </dev/tty
done
Observe que:
Eu uso algo ao longo destas linhas, por night cron , para criar miniaturas de novas imagens no meu arquivo de imagens pessoais, então uso rsync para fazer um backup de todas as imagens em uma segunda máquina.
Não é cp -a, o comutador -a é o comutador de arquivo.
Deve ser cp -R, o interruptor recursivo.
Você também pode adicionar a opção -f para forçar a sobregravação.
Até onde eu sei, um mv
recursivo não é possível. Sugiro executar um cp -R
seguido por um rm -r
.
Tags linux file-management