Substituir link simbólico por alvo

4

Como você pode substituir todos os links simbólicos em um diretório (e filhos) com seus destinos no Mac OS X? Se o alvo não estiver disponível, prefiro deixar o link sozinho.

    
por George Tsiokos 09.06.2010 / 14:21

3 respostas

1

Se você estiver usando aliases do mac OSX, o find . -type l não criará nada.

Você pode usar o seguinte script [Node.js] para mover / copiar os destinos de seus links simbólicos para outro diretório:

fs = require('fs')
path = require('path')

sourcePath = 'the path that contains the symlinks'
targetPath = 'the path that contains the targets'
outPath = 'the path that you want the targets to be moved to'

fs.readdir sourcePath, (err,sourceFiles) ->
    throw err if err

    fs.readdir targetPath, (err,targetFiles) ->
        throw err if err

        for sourceFile in sourceFiles
            if sourceFile in targetFiles
                targetFilePath = path.join(targetPath,sourceFile)
                outFilePath = path.join(outPath,sourceFile)

                console.log """
                    Moving: #{targetFilePath}
                        to: #{outFilePath}
                    """
                fs.renameSync(targetFilePath,outFilePath)

                # if you don't want them oved, you can use fs.cpSync instead
    
por 22.04.2012 / 18:05
5

Veja aqui as versões de chmeee's resposta que usa readlink e funcionará corretamente se houver espaços em qualquer nome de arquivo:

Novo nome do arquivo é igual ao nome do link antigo:

find . -type l | while read -r link
do 
    target=$(readlink "$link")
    if [ -e "$target" ]
    then
        rm "$link" && cp "$target" "$link" || echo "ERROR: Unable to change $link to $target"
    else
        # remove the ": # " from the following line to enable the error message
        : # echo "ERROR: Broken symlink"
    fi
done

Novo nome do arquivo é igual ao nome do alvo:

find . -type l | while read -r link
do
    target=$(readlink "$link")
    # using readlink here along with the extra test in the if prevents
    # attempts to copy files on top of themselves
    new=$(readlink -f "$(dirname "$link")/$(basename "$target")")
    if [ -e "$target" -a "$new" != "$target" ]
    then
        rm "$link" && cp "$target" "$new" || echo "ERROR: Unable to change $link to $new"
    else
        # remove the ": # " from the following line to enable the error message
        : # echo "ERROR: Broken symlink or destination file already exists"
    fi
done
    
por 10.06.2010 / 03:38
1

Você não disse quais nomes os arquivos devem ter após a substituição.

Esse script considera que os links substituídos devem ter os mesmos nomes que eles tinham como links.

for link in 'find . -type l'
do 
  target='\ls -ld $link | sed 's/^.* -> \(.*\)//''
  test -e "$target" && (rm "$link"; cp "$target" "$link")
done

Se você deseja que os arquivos tenham o mesmo nome que o destino, isso deve ser feito.

for link in 'find . -type l'
do
  target='\ls -ld $link | sed 's/^.* -> \(.*\)//''
  test -e "$target" && (rm $link; cp "$target" 'dirname "$link"'/'basename "$target"')
done
    
por 09.06.2010 / 15:14