全部同じ内容になるというやらかした mv コマンド挙動のメモ

全部同じ内容になるというやらかした mv コマンド挙動のメモ

全部同じ内容になるというやらかした mv コマンド挙動のメモです。

背景

Raspberry Pi でよくやるんですよね。ファイル整理。設定整理。

なけなしの CLI 力とコマンド知識で GUI なしでファイル整理をしていたところ、うっかりアスタリスク「*」を使うことで mv コマンドでやらかしたことメモしておきます。

横着しての 2 年ほどぶり 2 回目のやらかしなので、これは記しておきます。

しかも、たしか、コーディングエージェントにも、そんな指示をしていたときも、自然と直してくれてて「言うこと聞いてくれないなー」とか勘違いしてまして、コーディングエージェントは空気を読んで自然と回避してくれている、高度な行動をしてくれていたわけで、もうそれを後で気づいたのも恥ずかしくて、やばい記さないと思った次第です。

実行したコマンド(問題のあるもの)

mv ~/project-a/important_script.sh ~/project-b/*

いちいちファイル移行するのめんどいなーと思ってやったコマンドです。もうこれでやらかしです。

ファイル指定をアスタリスクで横着したわけです。

こんなことが起きました

キャプチャ載せようと思いましたが、再現するにも恐ろしいものなので、キャプチャなしです。すいません。

どうなったかというと、ログだけで感じてください。

  • important_script.sh~/project-b/ 内のすべてのファイルを上書き
  • 例:~/project-b/file1.txt, file2.py, config.json があった場合
    • file1.txtimportant_script.sh の内容で上書き
    • file2.pyimportant_script.sh の内容で上書き
    • config.jsonimportant_script.sh の内容で上書き
  • 元の important_script.sh は消失

ひいい。元ネタもなくなり、フォルダ先の数ファイル(数ファイルでよかった?)が、消失・破壊されたわけです。

どうすればよかったのか

端的にいうと、横着しない。ちゃんと、明示する。ですね。

# 特定の名前で移動する場合
mv ~/project-a/important_script.sh ~/project-b/important_script.sh

これが大切。

横着するにもアスタリスクがまずい。

# ディレクトリに移動する場合
mv ~/project-a/important_script.sh ~/project-b/

だったらうまくいきます。うん、もともと私が求めていたもので、そうですよね。

今回のは、幸い Git リポジトリで動いている場所に設定ファイルとかシェルファイルだけ移動したかったので、速やかに .example から復帰できましたが、いやー、焦りました。

この mv 後にすぐ「さ、ファイル内の設定変えようー」とエディタでみたら、全部、移行元のコードと同じになってた、と気づけたのいいですけど、これ 1 か月ごとか、作業後の数日後とかだと、経緯が分からず「ハッキングだ!!!」とか混乱していたと思います。

あと予防策としては、

# 移動前に移動先の内容を確認
ls ~/project-b/

は、基本。一呼吸入れる効果もある。横着しない。

# より安全なcp + rm の組み合わせを検討
cp ~/project-a/important_script.sh ~/project-b/
# 確認後に
rm ~/project-a/important_script.sh

そうそう、そもそも mv は原本が移動しちゃうので危ない。cp でコピーして、作業をやり切ったら削除がいいですね。

教訓としては、こんなところです!

  • * を含む mv コマンドは絶対にやらない
  • 重要なファイルを扱う時は事前確認を怠らない
  • gitなどのバージョン管理下で作業することは大切。万が一、復活できる。
  • コーディングエージェントにこういうインシデント入りのお願いしていても気を利かせて補正してくれるので、やばさに気づけず AI との仮想的な経験が積まれない領域となり、結果としてリアルにやらかす

こういう苦い経験を胸に頑張っていきます!学びにはなりました!