Veja o que acabei usando:
file1=1stfile
file2=2ndfile
temp="$(mktemp -dp /mnt/sdcard)"
mv "$file1" $temp
mv "$file2" "$file1"
mv $temp/"$file1" "$file2"
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?
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.
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.
Tags rename files shell shell-script