Como definitivamente mover um arquivo sem sobrescrever nada

2

Existe um comando ou opção que me permita mover arquivos sem sobrescrever nada?

Para fins de argumentação, vamos chamar o arquivo foo.rar.

Agora, o tipo -n funciona, não sobrescreverá o arquivo. Mas se um arquivo estiver lá, ele também não moverá o arquivo. Eu quero o arquivo movido, exceto por um erro do sistema como otu de espaço em disco.

-b funciona também. O problema com -b é que, se houver um arquivo de backup, -b irá chocar o arquivo de backup com o novo arquivo de backup.

Então, agora, para adicionar um pouco de carne à pergunta, vamos olhar nosso exemplo de foo.rar. Vamos fazer uma busca por foo.rar em / home. Encontramos 10 arquivos diferentes com esse nome. O que eu gostaria de fazer é executar os três comandos a seguir.

mkdir /tmp/foo_files
find /home -iname "foo.rar" -exec wanted_mv_command {} /tmp/foo_files \;
mv /tmp/foo_files ~/

Eu quero que o ~ / foo_files contenha algo como: foo.rar, foo.rar.1, foo.rar.2 ... foo.rar.9.

Eu não me importo com o padrão usado. Em vez de foo.rar. # Poderia, por exemplo, usar foo. #. Rar > Eu quero apenas duas coisas. Isso indica qual era o nome original do arquivo e mostra versões distintas do arquivo.

    
por Mouse.The.Lucky.Dog 19.12.2015 / 20:31

2 respostas

5

Como você está usando o GNU mv, você pode usar sua opção --backup . Basta ligar os backups numerados.

 mv --backup=numbered file1 file2 your_dir

Você pode alterar o sufixo por meio da opção -S .

Aqui está um exemplo:

$ mv --backup=numbered aa/foo bb/foo cc/foo .
$ ls
aa  bb  cc  foo  foo.~1~  foo.~2~
    
por 19.12.2015 / 21:54
3

Acabei de criar um pequeno script, vamos chamá-lo de mv_safe.sh . Uso: mv_safe SOURCE_FILE TARGET_DIRECTORY

if test ! -e "$2/$1"
then
  mv -- "$1" "$2"
else
  tries=1
  while test -e "$2/$1.$tries"
  do
    tries=$((tries+1))
  done
  mv -T -- "$1" "$2/$1.$tries"
fi

Atenção: isso não é atômico. Se você executar várias cópias desse script em paralelo e acontecer de elas segmentarem o mesmo arquivo, elas poderão sobrescrever os arquivos uns dos outros.

Exemplo: você tem feefoo/foo.bar e foo.bar no seu / tmp:

$ ./mv_safe.sh foo.bar feefoo

Então, queremos mover "com segurança" foo.bar para feefoo , onde o nome " foo.bar " já está sendo usado. Vamos ver o que isso dá:

$ ls feefoo
foo.bar   foo.bar.1

Um nome usual mv if $1 ainda não é usado em $2

Espero que ajude:)

    
por 19.12.2015 / 21:39

Tags