安全な mv cp コマンドを行いたい

2022-06-30

こんにちは、0371です。
仕事でよくやらかすことがあるので、安全な cp mv コマンドを考えます。

オプションを使う

意図しない上書きや、操作ミスを少しでも防ぎます。

# 準備
sudo echo SIMPLE_BACKUP_SUFFIX=_`date +%Y%m%d-%H%M%S`.back >> ~/.profile

# コマンド
cp -ab コピー元 コピー先 
mv -bv 移動元 移動先 >> ~/mvlog/mv_`date +%Y%m%d-%H%M%S`.log

このコマンドを覚えれば安全にコピーと移動ができるでしょう。

解説

解説というほどでもないのですが、解説していきます。

cpコマンド

cp -ab コピー元 コピー先 

単純なcpコマンドに、オプションが2つついています。

-a 元のファイルの属性とディレクトリ構成を可能な限り保持する。
-b 上書きされるファイルのバックアップを作成する。

-a を使用することで、コピー元の権限を保持します。
chmod や chown を行わなくても良くなります。

-b が重要で、コピー先のファイルが上書きされてしまう場合に、自動的にバックアップを作成してくれます。
このオプションを日常的に使用することで、誤ってファイルを上書きしてしまった場合でも、生成されたバックアップに戻せば元通りになります。
(ハッシュ値は変わってしまいますが・・・)

-b で、生成されるバックファイルの名前ですが、初期設定だと末尾に「~」が付くだけになります。 これだけでは、時間が経つにつれてファイルの存在意義がわからなくなってしまい、バックアップファイルを削除してしまう可能性があります。 それではバックアップの意味がないため、「~」ではなく日付をつけたいですよね。

・・・。

ということで環境変数を設定します。

環境変数

sudo echo SIMPLE_BACKUP_SUFFIX=_`date +%Y%m%d-%H%M%S`.back >> ~/.profile

上記コマンドで、cp mv コマンドで使用する環境変数「SIMPLE_BACKUP_SUFFIX」を設定しています。
echo コマンドで「SIMPLE_BACKUP_SUFFIX=_`date +%Y%m%d`.back」を標準出力し、~/.profileに追記(リダイレクト)させています。
追記の際には、``で囲まれている「date +%Y%m%d」が展開されます。
コマンド実行時の日付がYYYYMMDD形式で格納されます。

つまり、~/.profileに「SIMPLE_BACKUP_SUFFIX=_20220630-101540.back」を追記するということです。

サーバからログアウトする間だけ使えればいいという方は、以下のコマンドでも良いです。

export SIMPLE_BACKUP_SUFFIX=_`date +%Y%m%d-%H%M%S`.back

ちなみに、環境変数の追加すら行いたくない状況の場合は、-S オプションも存在します。
接尾辞に「_`date +%Y%m%d`.back」を入れるといいでしょう。

cp -ab -S 接尾辞 コピー元 コピー先 

mvコマンド

では、mvコマンドを見ていきます。

mv -bv 移動元 移動先 >> ~/mv_log/mv_`date +%Y%m%d-%H%M%S`.log

-b オプションはcp コマンドと同様です。
自動バックアップしてくれて、SIMPLE_BACKUP_SUFFIXの値をファイル名の末尾につけます。

-v オプションで mv コマンドの結果を表示してくれます。

$ mv -v test.txt ./test
renamed 'test.txt' -> './test/test.txt'

その結果をリダイレクトでログファイルに出力することで、どのファイルをどこから移動させたかが分かるようになります。
実はcp コマンドでも同じように -v コマンドが使用可能です。

まとめ

ファイルの移動やコピーは、バックアップを作成するように心がけましょう。

# 準備
sudo echo SIMPLE_BACKUP_SUFFIX=_`date +%Y%m%d-%H%M%S`.back >> ~/.profile

# コマンド
cp -ab コピー元 コピー先 
mv -bv 移動元 移動先 >> ~/mvlog/mv_`date +%Y%m%d-%H%M%S`.log

今日の一言

うっかりミスを無くしたい😌