web-dev-qa-db-ja.com

ファイルを移動し、ソフトリンクを残します

これと同等のことを実行できる単一のLinuxコマンドを探しています。

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

ない場合、ファイルの束に対してこれを行うための最良の方法は何ですか?

10
itsadok

ちなみに、コマンドを実際にデータを移動させないようにするために、両方のパスを同じファイルシステム上にあると仮定して、両方の時間にlnを使用できます。

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

ただし、/ some/path /のコンテンツを別のディスクに移動してから、「誰も」気付かないように新しいファイルへのリンクを作成するとします。

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

それをbash関数でラップします。

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}
7
Mr Shark

あなたが使用できるスクリプトがあります(2つのパラメータ/ some/path/fileと/ another/path /を取ります):

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

真剣に、これは本当に簡単な質問だと思いました。

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/");
}

もっとエレガントなものが欲しかったのですが、それを使うと思います。

1
itsadok