find + xargs | 親ディレクトリへの移動

以前の記事で、Argument list too longというエラーメッセージがでたら、findとxargsコマンドを使う方法を紹介しました。

しかし、大量のファイルを子ディレクトリ(階層が低い)から親ディレクトリ(階層が高い)へ移動はできても、親ディレクトリから子ディレクトリへ移動する際に移動できないということになりましたので、ここに記します。

エラー時のコマンド

子ディレクトリ(階層が低い)から親ディレクトリ(階層が高い)への移動

 $ find -name "*" | xargs -I {} mv {} ../

こちらは上手く実行出来ました。しかし、

親ディレクトリから子ディレクトリ(Child)へ移動

 $ find -name "*" | xargs -I {} mv {} ./Child

すると、以下のようなエラーメッセージが発生しました。

mv: ‘./Child/sample.txt’ and ‘./Child/sample.txt’ are the same file

エラーメッセージから推察

親ディレクトリだけにあるファイルが子ディレクトリにもあると言われています。

同じファイルがあるので移動できないというわけです。

原因

findコマンドは、今いるカレントディレクトリ以下を全て検索しています。

そのため、子ディレクトリの中も検索しているのが原因です。

カレントディレクトリのみを検索する必要があります。

解決方法

以下のように実行します。

 $ find -name "*" -maxdepth 1 | xargs -I {} mv {} ./Child

-maxdepth 1 でカレントディレクトリのみを検索しています。

こうすることで親ディレクトリから子ディレクトリに移動することができました。

まとめ

findコマンドのオプション-maxdepth 1でカレントディレクトリのみを検索します。