ti-enxame.com

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

Estou procurando um único comando linux que me permita fazer o equivalente a este:

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

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

10
itsadok

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

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

Mas eu suponho que você deseja mover o conteúdo de/alguns/path/para um outro disco e, em seguida, criar links para os novos arquivos de modo "Ninguém".

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
}
7
Mr Shark

Há meu script que você poderia usar (leva 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%/*}
2
Kazimieras Aliulis

Sério, pensei que esta era uma pergunta muito fácil.

Aqui está o que posso fazer em 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 por algo mais elegante, mas eu acho que vou usar isso.

1
itsadok