Como forçar a sobrescrever diretórios não vazios usando 'mv'

15

Eu estou querendo mover (não apenas copiar) um grupo de arquivos / diretórios para um diretório diferente, alguns dos quais possuem conflitos de nome com arquivos / diretórios no diretório de destino. Meu objetivo principal é mover os arquivos, para que eu possa tolerar que o diretório não vazio seja sobrescrito.

No momento, estou usando mv ... destination , mas ocasionalmente recebo

mv: cannot move 'target' to /destination/target': Directory not empty

Eu tentei mv -f ... destination sem sucesso e, como quero que os arquivos saiam do local original, rsync não parece ser apropriado.

Como bônus, existe uma boa solução para preservar os arquivos que podem ser sobrescritos de alguma forma, talvez renomeando?

    
por user1227038 04.01.2014 / 10:59

2 respostas

18

Se você usa mv --backup=numbered
  (ou uma das outras opções para a opção --backup ),
então mv completará a mesclagem e preservará os arquivos que serão sobrescritos.

    
por 04.01.2014 / 12:22
1
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
SRC=/path/to/source
DST=/path/to/destination

for item in $SRC/*; do
    if [[ -f "$DST/$(basename "$item")" ]]; then
        newitem=$(basename $item)_old
        while [[ -f "$DST/$newitem" ]]; do
            newitem=${newitem}_old
        done
        mv "$DST/$(basename $item)" "$DST/$newitem"
    fi
    mv "$item" "$DST/$(basename $item)"
done
    
por 04.01.2014 / 11:07