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


10

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

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

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


私はBashスクリプトを記述できるほど詳しくは知りませんが、私の解決策は、スクリプトを記述してcplnのようなキャッチーなものと呼ぶことです
Unkwntech

1
cpをmvにすべきではありませんか?
Bart van Heukelom、2009年

いいえ。lnの-fオプションは、それを処理します。
innM 2009年

1
10GBファイルでお試しください
hayalci 2009年

2
@HelloGoodbyeあなたは混乱&&してい&ます。書かれているように、この行はcpの戻り値をチェックし、成功した場合にのみ2番目の部分を実行します。
itsadok

回答:


7

ちなみに、コマンドを実際にデータを移動させないようにするために、両方のパスを同じファイルシステム上にあると想定して、両方の時間に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
}

私が動かしているものがたまたまディレクトリである場合、これを機能させる方法はありますか?
tladuke、2012

これにより、ディスク上の実際のファイルはどのように移動しますか?
イブラヒム

イブラヒム:データは移動せず、ディレクトリ内のポインターを更新するだけです。
Shark氏、

tladuke:はい、いいえ。ディレクトリはディスク上ではるかに小さいため、lnトリック(ディレクトリでは機能しません)は必要ありません。mvを実行するだけです:-)
Mr Shark

2

あなたが使用できるスクリプトがあります(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%/*}

文字列操作のクールなトリック、これまで見たことがない。ありがとう!
itadok 2009年

1

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

これが私が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
「Perl」でこれを行うには、File :: Copy(または類似の)とsymlink()を使用する必要があります。Perlはシェルではありません。system()を避け、特にコマンドライン全体をsystem()に渡さないようにします(たとえば、引数にスペースが含まれている場合はどうなりますか?)。どちらの方法でも、常に、常に、常に戻り値をチェックします。
ジョンシラクサ、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.