Melhor maneira de trocar nomes de arquivos

7

Eu preciso trocar nomes de arquivos de dois arquivos ( file e file_1 ). Eu estou usando o seguinte código para isso.

mv file .phfile
mv file_1 file
mv .phfile file

Isso funciona, mas é muito bugs, às vezes até resulta em perda de dados. Existe uma maneira melhor de fazer isso?

    
por Binoy Babu 28.02.2012 / 01:36

3 respostas

2

Veja o que acabei usando:

file1=1stfile
file2=2ndfile
temp="$(mktemp -dp /mnt/sdcard)"
mv "$file1" $temp
mv "$file2" "$file1"
mv $temp/"$file1" "$file2"
    
por 01.03.2015 / 20:17
2

Não há um modo de baixo nível para trocar arquivos, então você precisa usar um nome temporário intermediário. Para maior robustez, certifique-se de que o nome temporário não seja usado por nenhum outro programa (use mktemp ) e esteja no mesmo sistema de arquivos que um dos arquivos (caso contrário, os arquivos seriam copiados desnecessariamente em vez de serem renomeados). ).

swap_files () {
  tmp_name=$(TMPDIR=$(dirname -- "$1") mktemp) &&
  mv -f -- "$1" "$tmp_name" &&
  mv -f -- "$2" "$1" &&
  mv -f -- "$tmp_name" "$1"
}
swap_files file file_1

Tenha em atenção que, se ocorrer um erro, o primeiro ficheiro poderá ainda estar sob o nome temporário e o segundo ficheiro poderá ou não ter sido movido. Se você precisar de robustez em caso de interrupções e travamentos, pode ser mais fácil recuperar uma variante com dois nomes temporários.

swap_files2 () {
  tmp_dir1=$(TMPDIR=$(dirname -- "$1") mktemp -d .swap_files.XXXXXXXXXXXX) &&
  tmp_dir2=$(TMPDIR=$(dirname -- "$2") mktemp -d .swap_files.XXXXXXXXXXXX) &&
  mv -f -- "$1" "$tmp_dir1/" &&
  mv -f -- "$2" "$tmp_dir2/" &&
  mv -f -- "$tmp_dir1/"* "$1" &&
  mv -f -- "$tmp_dir2/"* "$2" &&
  rmdir -- "$tmp_dir1" "$tmp_dir2"
}

Se os diretórios temporários .swap_files.???????????? estiverem presentes em uma reinicialização, isso significa que uma troca de arquivos foi interrompida por uma falha de energia. Cuidado, é possível que um dos arquivos já tenha sido colocado no lugar e o outro não, então o código aqui não cuida de todos os casos, depende do tipo de recuperação que você quer.

    
por 01.03.2015 / 15:49
1

Isso é mais robusto:

TMPFILE=tmp.$$
mv -- "$file1" $TMPFILE && mv -- "$file2" "$file1" && mv -- $TMPFILE "$file2"

a cotação é para evitar problemas com espaços em nomes de arquivos, ele usa um arquivo tmp e & & faça o seguinte comando ser executado apenas se o precedente tiver terminado com sucesso.

    
por 28.02.2012 / 01:55