markdown

はじめに (対象読者・この記事でわかること)

この記事は、Linux/macOSのターミナルで「あるディレクトリに入っているファイルをすべて別の場所へ移動したい」と思っている方を対象にしています。
特に「サブディレクトリも含めて一気に移動」「移動先ですでに同名ファイルがあるときだけスキップ」といった条件をワンライナーで実現したい方に最適です。
記事を読むことで、find・xargs・mv を組み合わせた安全かつ高速な一括移動スクリプトの作り方と、よくある落とし穴の回避法が身につきます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - ターミナルで cdls コマンドを使ったことがある - パイプ(|)でコマンドを繋げたことがある - ファイル移動の基本コマンド mv を知っている

なぜ「一括移動」が難しいのか

GUIでフォルダを開いてファイルを選択→カット→移動先でペースト、という操作は直感的ですが、1万単位のファイルになるとExplorer/Finderがフリーズしたり、隠れファイルを見落としたりします。
シェルで mv * ../dest とすると、サブディレクトリは移動せず、ファイル名にスペースや特殊文字が含まれているとコマンドが壊れます。
そこで「find で再帰的に拾い、xargs でバッチ処理、mv で安全に移動」という三段構えが汎用的かつ高速である理由を解説します。

ワンライナーで安全に一括移動する

ステップ1: 移動対象を dry-run して確認する

Bash
SRC=~/Downloads DEST=~/Archive find "$SRC" -type f -print0 | xargs -0 -n1 -I{} echo mv -n {} "$DEST"

ポイント
- -print0 / -0 でファイル名に改行やスペースが含まれても安全
- -n1 -I{} で1ファイルずつ処理(後述の上書き回避のため)
- echo を前置して dry-run。画面に表示されるコマンドを目視確認
- mv -n は「移動先に同名ファイルが存在すればスキップ」

ステップ2: 本実行して進捗を可視化する

dry-run で問題なければ echo を外して実行します。

Bash
find "$SRC" -type f -print0 | xargs -0 -n1 -I{} mv -v -n {} "$DEST"

-v を付けることで「~/Downloads/a.txt -> ~/Archive/a.txt」のように移動ログが出力され、進捗が可視化されます。
数万ファイルある場合は pv をパイプに挟むとより安心です。

Bash
find "$SRC" -type f -print0 | pv -0 -l -s $(find "$SRC" -type f | wc -l) | xargs -0 -n1 -I{} mv -v -n {} "$DEST"

ステップ3: 空になったディレクトリを一括削除(オプション)

ファイル移動後、ディレクトリ構造だけ残る場合があります。
find "$SRC" -type d -empty -delete でからっぽのディレクトリを削除できます。
※誤削除防止のため、echo を前置して dry-run することを忘れずに。

ハマった点と解決策

トラブル 原因 対処
Argument list too long 展開後の引数が上限を超える xargs -n1 で1ファイルずつ実行
ファイル名に '" が含まれるとコマンドが壊れる シェル展開 find -print0 + xargs -0 で NUL 区切り
移動先で上書きしてしまった mv デフォルト動作 mv -n または mv --backup=numbered
移動中に中断して重複が発生 シグナル受信 rsync --remove-source-files に切り替える

まとめ

本記事では、Linux/macOSで「ディレクトリ内のファイルを一括移動」する際の落とし穴と、find/xargs/mv を使った安全なワンライナーを紹介しました。

  • find -print0 + xargs -0 で特殊文字を含むファイル名に対応
  • mv -n で上書きを回避し、mv -v で進捗を可視化
  • pv を挟むことで大規模移動の残り時間を推測可能

このテクニックを活用すれば、バックアップ整理やCIビルドアーティファクトの集約、写真・ログの月次アーカイブなど、日常の繰り返し作業が一瞬で完了します。
次回は「移動ではなくコピー+元ファイル削除」で失敗時にロールバックできる rsync パターンを詳しく解説予定です。

参考資料

  • GNU Coreutils Manual – mv オプション一覧
    https://www.gnu.org/software/coreutils/manual/html_node/mv-invocation.html
  • 高橋 浩太郎『Linux シェルプログラミング実践テクニック』(技術評論社, 2022)
  • 公式 manページ(find, xargs, pv)