Alterna o symlink e o diretório

2

Eu tenho um diretório e um link simbólico para ele:

mkdir dir
ln -s dir dir_symlink

Eu quero substituir o symlink pelo diretório e pelo diretório com o symlink. Existe uma maneira de fazer isso atomicamente (ou muito rápido)? O diretório é grande.

dir agora deve ser um link simbólico para o diretório dir_symlink (que não é mais um link simbólico e contém o conteúdo anterior de dir ).

    
por Hatshepsut 04.08.2017 / 00:33

3 respostas

2

se eu tivesse que fazer isso com muita frequência, Eu escreveria um pequeno roteiro como este:

#!/bin/bash

echo "select symlink"
read -e -r symlink
echo "select directory"
read -e -r dir

var=$(echo "$dir" | sed 's/\///g')

rm "$symlink"
mv "$dir" "$symlink"
ln -s "$symlink" "$var"

o comando sed remove o / que é adicionado quando você usa o preenchimento automático para a entrada.
Observação: ele removeria todos eles, também se você selecionasse um árvore de diretórios.

Você pode dizer que sed corresponde apenas ao final da linha assim: sed 's/\/*$//g'

    
por 04.08.2017 / 02:08
2

Se os diretórios estiverem no mesmo sistema de arquivos mv estará renomeando o diretório e não envolverá nenhuma cópia. Apenas remova o link simbólico antigo, renomeie o diretório usando mv e crie um novo symlink.

    
por 04.08.2017 / 00:35
2

Vale a pena notar que, se estiver em uma máquina macOS, o novo sistema de arquivos APFS suporta trocas atômicas apenas para esse tipo de cenário. Embora a funcionalidade não pareça estar embutida em um comando como mv, ela é acessível com um pouco de código Swift (o código C é quase idêntico, mas você pode facilmente colá-lo no Swift REPL, que é mais fácil ):

import Foundation
renamex_np("/path/to/file/one", "/path/to/file/two", UInt32(RENAME_SWAP))
    
por 04.08.2017 / 03:38