mvコマンドではゴミ箱(.Trash)に同名フォルダがあると移動できませんでした。
シェルスクリプトで、同名フォルダの存在を確認して、タイムスタンプを付加するようにしました。
1. mvコマンドでは同名フォルダがあると移動できない
シェルスクリプトで、コピー済みのフォルダをゴミ箱に移動していたら、うまく移動できていないことに気づきました。
Directory not empty
このエラーは、mvコマンドでフォルダ(ディレクトリ)を移動する際に、移動先にも同じフォルダが存在する場合に表示されます。
mvコマンドでは、同名フォルダが重複しても、勝手に統合してくれるわけではありません。
2. Finderの「削除」では添字が付加されていた
しかし、ふだんの「削除」、つまり Finder でフォルダを削除するときには、同じ名前を気にする必要はありません。
実は、Finderでは、削除でも、ゴミ箱への移動でも、ファイル名が重複した場合には、後ろに添え字が追加されています。
つまり、自動的にフォルダ名の重複を防いでくれているんですね。
ファイル名重複を避ける処理を追加する必要があるわけです。
3. macにはmvコマンドのオプションbackupがない
mvのGNU coreutils 9.1のマニュアル(mv invocation (GNU Coreutils 9.1))を見ると、backupとsuffixのオプションがあります。
例えば、このようにタイムスタンプを元に、バックアップをすることができます。
mv --backup --suffix=.$(date +%Y%m%d_%H%M%S) 移動元 移動先
ところが、macosのターミナルでは、無効なオプションになってしまいます。
macのターミナルでman mvを表示すると、オプションが少ないのです。
4. スクリプトで同名ファイルの存在確認とタイムスタンプ
そうなると、自分でバックアップのスクリプトを組む必要があります。
このシェルスクリプトでは、$SRCにカレントディレクトリを移動して、内部のファイルをゴミ箱に移動しています。
もし、すでに同名ファイルがある場合は、タイムスタンプを追加してリネームしています。
DST=~/.Trash
cd $SRC
for file in *; do
newfile="$DST"/$file
while [ -e $newfile ]; do
newfile="$DST"/${file##*/}`date "+%Y-%m-%d-%H%M%S"`
done
mv -v "$file" "$newfile"
done
フォルダ「a」を作成して何度もゴミ箱に移動したら、ちゃんとタイムスタンプが追加できました。
こちらもどうぞ。