スポンサーリンク

[mac] ゴミ箱に移動したフォルダ名が重複した場合【Directory not empty】

とりあえずのメモパソコン基礎知識プログラミング

mvコマンドではゴミ箱(.Trash)に同名フォルダがあると移動できませんでした。

シェルスクリプトで、同名フォルダの存在を確認して、タイムスタンプを付加するようにしました。

スポンサーリンク

mvコマンドでは同名フォルダがあると移動できない

シェルスクリプトで、コピー済みのフォルダをゴミ箱に移動していたら、うまく移動できていないことに気づきました。

Directory not empty

このエラーは、mvコマンドでフォルダ(ディレクトリ)を移動する際に、移動先にも同じフォルダが存在する場合に表示されます。

mvコマンドでは、同名フォルダが重複しても、勝手に統合してくれるわけではありません。

Finderの「削除」では添字が付加されていた

しかし、ふだんの「削除」、つまり Finder でフォルダを削除するときには、同じ名前を気にする必要はありません。

実は、Finderでは、削除でも、ゴミ箱への移動でも、ファイル名が重複した場合には、後ろに添え字が追加されています。

つまり、自動的にフォルダ名の重複を防いでくれているんですね。

ファイル名重複を避ける処理を追加する必要があるわけです。

macにはmvコマンドのオプションbackupがない

mvのGNU coreutils 9.1のマニュアル(mv invocation (GNU Coreutils 9.1))を見ると、backupとsuffixのオプションがあります。

  • –backup[=,CONTROL/]
    ファイルを上書きする際に、バックアップを作成する
    • none, off
      バックアップを作成しない (–backup を付けた時でも)
    • numbered, t
      番号付きバックアップを作成する
    • existing, nil
      番号付きバックアップがあれば番号付き、
      そうでなければ、simple で作成する
    • simple, never
      常に簡易バックアップを作成
  • -S, –suffix=,SUFFIX/
    通常のバックアップ接尾辞を SUFFIX で上書きする

例えば、このようにタイムスタンプを元に、バックアップをすることができます。

mv --backup --suffix=.$(date +%Y%m%d_%H%M%S) 移動元 移動先

ところが、macosのターミナルでは、無効なオプションになってしまいます。

macのターミナルでman mvを表示すると、オプションが少ないのです。

スクリプトで同名ファイルの存在確認とタイムスタンプ

そうなると、自分でバックアップのスクリプトを組む必要があります。

このシェルスクリプトでは、$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」を作成して何度もゴミ箱に移動したら、ちゃんとタイムスタンプが追加できました。

QRコードを読み込むと、関連記事を確認できます。
[mac] ゴミ箱に移動したフォルダ名が重複した場合【Directory not empty】
タイトルとURLをコピーしました