シンボリックリンクのみをmvしたい

ディレクトリ中に大量のファイルがある中、シンボリックリンクのみを指定し、移動する方法を紹介します。

ワイルドカードを用いることはできても…

ファイルを移動する際に用いるmvコマンド

ある複数ファイルを移動したいとき、ワイルドカードを駆使して、一括でmvコマンドを用いることはできます。

例:カレントディレクトリにあるPNG形式(画像)ファイルを/home/hogehoge/に移動

$ mv *.png /home/hogehoge/

上の例のようにワイルドカードを駆使することで、ある特定の拡張子や特定のワードを一括で移動できるとは思います。

しかし、ディレクトリ中で大量のファイルがある中、シンボリックリンクのみ移動する場合、どうすればよいでしょうか。

シンボリックリンクのみを探す

シンボリックリンクのみを移動するには、シンボリックリンクを取り出す必要があります。

それには、findコマンドを用います。

$ find 対象パス -type l

対象パスで取り出すファイル群やディレクトリを指定します。

-type l でシンボリックリンクを取り出しています。

mvコマンドの引数として渡す

findコマンドでシンボリックリンクだけを取り出せました。

そのシンボリックリンクをmvコマンドの引数として渡す必要があります。

 $ mv 対象のファイル 移動先のディレクトリのパス

対象のファイルは、今回は、シンボリックリンクですね。

引数として渡すコマンドとしてxargsコマンドを用います。

$ コマンド1 | xargs コマンド2

xargsコマンドは、コマンド1の結果から受け取った文字列を引数に指定して、与えられたコマンド2を実行するコマンドです。

|は、パイプラインといい、コマンド1の結果を次のコマンド2へ橋渡しするために使われるコマンドです。

つまり、xargsコマンドは、findコマンドの結果を引数として用いることができるコマンドなのです。

通常、xargsコマンドは、受け取った文字列をコマンドの最後の引数に指定します。

すると、mvコマンドの移動先のディレクトリのパスにfindコマンドの結果を代入してしまい、予想される結果となりません。

この問題を解決する方法として、mvコマンドのtオプションを用いることで、明示的に移動先のディレクトリのパスに移動するようにさせます。

$ mv -t 移動先のディレクトリのパス 対象のファイル

対象のファイルにfindコマンドを結果が文字列として代入され、実行されます。

シンボリックリンクのみを移動するコマンド

以上、説明したことをまとめてコマンドにすると

$ find 対象パス -type l | xargs mv -t 移動先のディレクトリ

となります。

例:カレントディレクトリのシンボリックリンクのみを/home/hogehogeに移動

$ find * -type l | xargs mv -t /home/hogehoge