Movendo arquivos no linux, anexando diretórios existentes no destino

1

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?

    
por Ilari Kajaste 07.09.2009 / 14:44

4 respostas

6

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.

    
por 07.09.2009 / 15:14
2

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:

  • _find * irá ignorar quaisquer arquivos / diretórios que iniciem com um ponto (".").
  • isso também não removerá os diretórios.

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.

    
por 11.09.2009 / 19:17
1

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.

    
por 07.09.2009 / 14:47
0

Até onde eu sei, um mv recursivo não é possível. Sugiro executar um cp -R seguido por um rm -r .

    
por 07.09.2009 / 15:03