Mova um arquivo e deixe um link suave por trás

8

Estou procurando um único comando do Linux que me permita fazer o equivalente a isso:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Se não houver, qual é a melhor maneira de fazer isso para um monte de arquivos?

    
por itsadok 14.05.2009 / 10:08

3 respostas

7

Uma pequena nota é que você pode usar as duas vezes para fazer o comando não mover os dados (assumindo que ambos os caminhos estejam no mesmo sistema de arquivos).

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Mas suponho que você queira mover o conteúdo de / some / path / para outro disco e, em seguida, criar links para os novos arquivos para que "ninguém" perceba.

for f in 'ls /some/path/'; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

Envolvendo-o em uma função bash:

function cpln {
    for f in 'ls $1'
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}
    
por 14.05.2009 / 13:41
2

Existe o meu script que você pode usar (usa dois parâmetros / algum / caminho / arquivo e / outro / caminho /):

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}
    
por 14.05.2009 / 13:29
1

Sério, achei que essa era uma pergunta muito fácil.

Veja o que posso fazer no perl:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

Eu estava esperando algo mais elegante, mas acho que vou usar isso.

    
por 14.05.2009 / 13:28