Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2011-01-06

後悔しない最高のゴミ箱環境を模索する

ゴミ箱は、GUIなOS環境の一つの象徴である。ゴミ箱のないデスクトップなんて、ガリのない寿司みたいな物足りなさを感じる。ゴミ箱があるからこそ、デスクトップにリアルな親近感が湧くのだ。どうして、こんなにもデスクトップのゴミ箱に愛着してしまうのか?

デスクトップのゴミ箱は、不要なファイルを捨てるところである。まあ捨てるといっても、ゴミ箱の実体は「~/.Trash/」という不可視フォルダであり、実際は不要なファイルをそこへ移動するだけである。そして、移動しただけではファイルは削除されず「~/.Trash/」に存在し続ける。そこで「ゴミ箱を空にする」という操作をして初めて、ゴミ箱のファイルは削除される。

GUI以前のコマンドラインには、ゴミ箱という考え方はなかった。(と思う*1)ファイルやフォルダを削除するにはrmコマンドを使っていた。そのまま使えば、rmを実行した瞬間にファイルは削除される。あるいは、-iオプションによって、削除する前に確認メッセージも表示できるが、yを選択した瞬間にファイルは削除される。

だから、ゴミ箱というフォルダに移動して一時的に保存しておくという考え方は、画期的なことだと思った。なぜなら、間違って必要なファイルを捨ててしまうこともあるからだ。rmコマンドでは削除を取り消せないが、ゴミ箱に移動しただけなら、必要なファイルを元の場所に戻せば救われるのである。この辺は、リアルな世界のゴミ箱の機能に近い。(ゴミ箱をあさった経験は、少なからず誰しもあると思う)

デスクトップのゴミ箱の基本的な仕様

不要なファイルを一時保存・戻す機能
  • ファイルやフォルダをゴミ箱に捨てると、「~/.Trash/」不可視フォルダに移動される。
  • しかし、工夫しないとファイル名称が重複してしまう可能性がある。
  • だから、ゴミ箱に同じファイル名が既に存在する時、後から捨てたファイルの名称には時間情報が付加される。
名称未設定フォルダ 14-19-12
名称未設定フォルダ
  • 「名称未設定フォルダ 14-19-12」は、14時19分12秒に捨てたファイルという意味である。
  • 起動ディスク以外(外付けHDなど)でファイルを捨てた時も「~/.Trash/」フォルダに移動してしまうと、ファイルは移動でなく、コピーになってしまう。
  • そこで起動ディスク以外では、そのボリューム直下に「/Volumes/ボリューム名/.Trashes/ログインユーザーID/」という不可視フォルダを作って、そこに移動する。
  • ファイルは、本における目次と本文のように管理されていて、ディレクトリ(フォルダ階層)は目次で、ファイルの内容は本文である。
  • 移動とコピーの違い。移動は目次を書き換えるだけ。コピーは新規に目次と本文を複製する。
    • 不要なファイルなのに、コピーするのは無駄である。
    • サイズが大きいとコピー処理に永遠と時間がかかる。
    • もしかしたら、起動ディスクの残量が少なくて、コピーできないかもしれない。
  • ゴミ箱を開くという行為は、「~/.Trash/」とマウントされている「/Volumes/ボリューム名/.Trashes/ログインユーザーID/」以下に存在する、すべてのファイルを一覧を表示することである。
  • ゴミ箱を空にするという行為は、「~/.Trash/」とマウントされている「/Volumes/ボリューム名/.Trashes/ログインユーザーID/」以下に存在する、すべてのファイルを削除することになる。
  • ゴミ箱にあるファイルを選択してcommand-deleteすると、「戻す」のショートカット操作となる。
  • 「戻す」とは、ゴミ箱のファイルを捨てる直前に存在していた場所に「戻す」操作である。

こうして見ると、ゴミ箱は単なるフォルダではなく、ゴミ箱らしく機能するよう随所に工夫があることに気付く。

TimeMachineのバックアップから除外される
  • ゴミ箱に入っているファイルは、TimeMachineのバックアップからは除外される。
  • その他にも、OSX標準でTimeMachineのバックアップから除外される項目は、以下のplistで確認できる。
    • /System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist
  • もちろん、任意のボリュームやフォルダ、ファイルさえも、バックアップ対象から除外できる。
    • システム環境設定 >> TimeMachine >> オプション >>「これらの項目をバックアップから除外:」に追加するのだ。

困った習慣

  • このように、ゴミ箱にはすぐに削除されない、という優れた利点がある。
  • にもかかわらず、人はよくゴミ箱をきれいさっぱり、空にしたがる。
  • リアルな世界のゴミ箱でさえ、一日の終わりに1回だけゴミ出しするだけなのに。
  • デスクトップのゴミ箱だと、即削除してしまう人もいる。(以前の自分も含めて)
  • なぜ、そんなにもゴミ箱を空にしたいのだろう?考えてみた。
    • 操作が簡単だから。(リアルな世界のゴミ箱にはない手軽さ)
      • ゴミ箱を開いて、空にするボタンを押す。
      • 「ファイル」メニューからゴミ箱を空にする。
      • ショートカットshift-command-deleteで、警告を表示してから削除。
      • ショートカットでshift-option-command-deleteで、警告なしで即削除。
    • ゴミ箱アイコンにゴミがたまっているように見えるから。
      • ゴミ箱にファイルが一つでも入っていると、ゴミ箱アイコンは紙屑が溜まった状態に変化する。
      • リアルな世界の経験から、紙屑が溜まったアイコンだと気になる。心理的に空っぽのアイコンにしたくなる。
    • 削除した時の音が快感。
      • ゴミ箱を空にする時には、数少ない効果音が発せられる。(グシャ、グシャ、グシャと紙を丸めた?ような音)
      • その音が、思い切りゴミを捨てたような感覚を呼び覚まして、結構気持ちいい。

ゴミ箱を空にする時の気持ち良さがあって、それを手軽に実行できてしまうところに、無駄に繰り返し空にしてしまうのかも。

  • そして、いずれは必ず経験する。必要なファイルなのに削除してしまった、という後悔...。
  • そんな経緯で、自分はゴミ箱を決して空にしない、と決心したのであった。

理想的なゴミ箱を想像する

では、ゴミ箱を空にする操作というのは、理想的にはどんなタイミングで行うべきなのだろう?

  • ゴミ箱の利点を最大限に生かすなら、ボリュームに十分な空き容量を確保できている間は、ファイルをそのまま溜め込むべきである。
  • しかし、ゴミを溜め込むという感覚は、精神衛生上あまり良くない。
  • そこで、ゴミ箱を空にした時、今までのようにファイルを削除するのではなく、さらに不可視のフォルダに移動するのはどうだろう?
  • 役割としては「処分場」のような意味合いになる。
  • その処分場フォルダでは、ボリュームに十分な空き容量を確保できている間は、そのままファイルを保存する。
  • ボリュームの空き容量が不足してきたら、削除した日時が古いファイルから順に自動的に削除するようにする。
  • ところで、ボリュームに十分な空き容量があったとしても、削除したいファイルの中には、とにかく人目に触れる前に素早く削除したいファイル、というのもあるかもしれない。
  • 処分場フォルダでは古いファイルから順に自動的に削除されるのだが、選択したファイルを手動で削除する選択肢も必要である。

こうして見ると、処分場フォルダの機能というのは、どうもTimeMachineに似ている気がする。

  • バックアップディスクが満杯になると、削除されている古いファイルから順に削除される。
  • バックアップディスクから特定のバックアップを完全に削除することもできる。
    • TimeMachineに入って、削除したいXXXXファイルを右クリック、「すべてのXXXXのバックアップを削除」を選択すればOK。

いっそのこと、OSXで管理するファイルシステム全体が履歴管理されてしまえば良いのに、と思ってしまう。そうすれば、間違って上書きしてしまったファイルも含めて、すべてのファイルを失う不安から解放されそうな気がする。

  • ちなみに、Dropboxは既に履歴管理されていて、上書きしたファイル、削除したファイルの履歴を検索して復元可能だったりする。

そうなった時、ゴミ箱は不要になるのかもしれない。

少しでも理想に近づける工夫

ゴミ箱を空にしない努力
  • Finderメニューや shift-command-delete 等で間違ってゴミ箱を空にしてしまわないように、
  • Finder 環境設定 >> 詳細 で「ゴミ箱を空にする前に警告を表示」をチェック入にしている。
削除日でソートする
  • いつの時点でゴミ箱に入れたか?(不要と判断したか)という情報は、ゴミ箱でファイルを探す検索キーになったり、完全に削除してしまう基準の日付になったりする。
  • ところが、OSXのゴミ箱では、ゴミ箱に入れた日時が表示されない。
  • 作成日時や変更日時、アクセス日時、ステータス変更日時は、OSやFinderが管理するファイル情報として持っているのに...。
  • 一方Windowsでは、ゴミ箱が削除日というのを持っており、ゴミ箱に入れた日付が記録されている。使い勝手がとってもいい!
  • OSXのゴミ箱にも削除日が欲しいと思ったが、簡単には実現できそうにない...。
  • そう思って考えていたら、閃いた。
  • Dockには追加日がある。~/.Trash/フォルダをDockに登録しておけば、追加日が削除日の代わりになりそうな気がした。
  • 但し、追加日は見えない。追加日でソートされるだけ。
  • それでも無いよりはマシな気がしたので、~/.Trash/をDockに追加しておいた。(追加日情報はどこに保存されているのだろう?)
削除日を記録する
  • 直近にゴミ箱に入れたファイルを参照するには、上記のような追加日順のソートで十分かもしれない。
  • しかし、ゴミ箱に入れて1年以上経過したものは削除しよう!なんて運用をしたくなると、やはりどうしても日時情報としての削除日が欲しくなる。
  • そこで、OSXがUNIXとして備えているタイムスタンプをもう一度見直してみた。
    • アクセス日時(atime)......読み込んだ時更新される。
    • 変更日時(mtime)...... 書き込んだ時更新される。
    • ステータス変更日時(ctime)...... mtimeの時&inodeデータを更新した時更新される。
  • 上記タイムスタンプの中で、ステータス変更日時(ctime)について、今までほとんど意識せずに利用していた。(そんなタイムスタンプがあったのか?と...。)
  • であれば、ステータス変更日時(ctime)をゴミ箱に移動したタイミングで更新してしまえば、削除日として利用できるのではないかと考えた。
  • そんな使い方してしまって良いのか若干躊躇したが、今までほとんど利用していなかった日時だし、ゴミ箱に入れる不要ファイルだし、問題ないと判断してしまった。
    • ctimeの活用例とか、削除日の代替としてしまうデメリットとか、是非、詳しい方にコメント頂けると嬉しいです。
  • アクセス日時(atime)・変更日時(mtime)をそのままに、ステータス変更日時(ctime)のみ更新するには、inodeデータ*2を修正すれば実現する。
  • いろいろ試してみると、OSX環境ではFinderでファイルのロックフラグを修正する方法が手軽な気がして、AppleScriptで以下のようにやってみた。
    • 以下のスクリプトを /Library/Scripts/Folder Action Scripts/update_change_time.scpt として保存した。

 on adding folder items to this_folder after receiving added_items
   
   tell application "Finder"
     repeat with f in (added_items)
       set f's locked to not f's locked
       set f's locked to not f's locked
     end repeat
   end tell
   
 end adding folder items to

  • スクリプトメニュー >> Folder Actions >> Configure Folder Actions を起動して、~/.Trashにフォルダアクションを設定した。

f:id:zariganitosh:20101231170537p:image

  • これで起動ディスクのゴミ箱については、ゴミ箱に捨てたタイミングで、ステータス変更日時(ctime)が更新されるようになった。
  • もし常時接続している外部HD(ハードディスク)があれば、そのHDのゴミ箱にもフォルダアクションを設定した方が良いかも。
    • /Volumes/ボリューム名/.Trashes/ログインユーザーID/
ゴミ箱を削除日順にリスト表示する
  • せっかく削除日として記録されるようになっても、残念ながら、Finderではステータス変更日時(ctime)を活用できない...。
  • でも、UNIXコマンドならステータス変更日時(ctime)を自在に活用できる。
  • 各ボリュームのゴミ箱の内容をステータス変更日時(ctime)順に一覧表示するエイリアスコマンド lstrash を設定してみた。
# エイリアスコマンド lstrash を定義するよ
$ alias lstrash='ls -AlcTt ~/.Trash /Volumes/*/.Trashes/`id -u`'

# 各ボリュームのゴミ箱の内容をステータス変更日時(ctime)順にリスト表示するよ
$ lstrash
/Users/zari/.Trash:
total 100664
-rw-------@ 1 zari  staff    21508 12 29 16:59:02 2010 .DS_Store
-rw-r--r--  1 zari  staff  2088635 12 29 16:58:38 2010 DSC_0034.JPG
-rw-r--r--@ 1 zari  staff   132179 12 29 16:58:38 2010 IMG_3965.jpg
-rw-r--r--@ 1 zari  staff   123464 12 29 16:58:38 2010 IMG_3981.jpg
-rw-r--r--@ 1 zari  staff  1252673 12 26 14:24:45 2010 DSC_1102.JPG
drwxr-xr-x  3 zari  staff      102 12 26 04:07:22 2010 名称未設定フォルダ 04-07-21/
-rw-r--r--@ 1 zari  staff  5263822 12 26 04:06:35 2010 TableTennis 3.3.ipa
drwxr-xr-x  2 zari  staff       68 12 26 04:06:35 2010 名称未設定フォルダ/
drwxr-xr-x  2 zari  staff       68 12 26 04:06:35 2010 名称未設定フォルダ 2/
drwxr-xr-x  2 zari  staff       68 12 26 04:06:35 2010 名称未設定フォルダ 3/
-rw-r--r--  1 zari  staff   381122 12 26 04:06:34 2010 101224-0001.png
-rw-r--r--@ 1 zari  staff  1268374 12 26 04:06:34 2010 AirVideoFree 2.4.2.ipa
-rw-r--r--@ 1 zari  staff   319994 12 26 04:06:34 2010 CM Movie 1.mov
-rw-r--r--@ 1 zari  staff   345969 12 26 04:06:34 2010 CM Movie 2.mov
-rw-r--r--@ 1 zari  staff   340724 12 26 04:06:34 2010 CM Movie 3.mov
-rw-r--r--@ 1 zari  staff  5187669 12 26 04:06:34 2010 Echofon 3.1.7.ipa

/Volumes/Macintosh SL/.Trashes/501/:
total 2472
-rw-------@ 1 zari  staff    12292 12 23 08:46:44 2010 .DS_Store
-rw-r--r--@ 1 zari  staff     1509 12  9 08:41:10 2010 mdls :Users:zari:Desktop:炊飯土鍋_ほんわかふぇ_取扱説明書 2 08-43-41.pdf
-rw-r--r--@ 1 zari  staff     1509 12  9 08:40:02 2010 mdls :Users:zari:Desktop:炊飯土鍋_ほんわかふぇ_取扱説明書 2 08-41-03.pdf

/Volumes/SL pure/.Trashes/501/:
total 16
-rw-------@ 1 zari  staff  6148 12 17 16:13:50 2010 .DS_Store
削除日でゴミ箱をフィルタリングする
  • それから、削除日の条件でファイルを手軽に抽出できれば便利かもしれない。
  • 各ボリュームのゴミ箱の内容をステータス変更日時(ctime)でフィルタリングするエイリアスコマンド trash も設定しておいた。
# エイリアスコマンド trash を定義するよ
$ alias trash='find ~/.Trash /Volumes/*/.Trashes/`id -u` -maxdepth 1 -mindepth 1'

# ゴミ箱に入れてから3日以内のファイルを抽出するよ
$ trash -ctime -3
/Users/zari/.Trash/.DS_Store
/Users/zari/.Trash/DSC_0034.JPG
/Users/zari/.Trash/IMG_3965.jpg
/Users/zari/.Trash/IMG_3981.jpg

# ゴミ箱に入れてから1年以上経過したファイルを抽出するよ
$ trash -ctime +365

# ゴミ箱に入れてから1年以上経過したファイルを抽出、削除するよ
$ trash -ctime +365 -exec rm -fR {} \;
すぐに削除しない
  • 「この操作は取り消しできません。」と警告してから削除するのも一つの方法だけど、
  • 警告なしで、時間差で削除するというのも良さそうな気がしてきた。
  • Tmp系のフォルダに移動することにすれば、次回の再起動時に削除される扱いになる。
  • それまでに間違って削除したと気付けば、救われる。
  • 警告するよりもスマートだし、完全に削除されるまで時間的猶予があるのもいい感じ。
# ユーザ別の一時フォルダを作って、
$ TRASH_DIR="${TMPDIR}Trash_`date '+%Y%m%d%H%M%S'`"
$ mkdir $TRASH_DIR

# ゴミ箱に入れてから1年以上経過したファイルを抽出、ユーザ別の一時フォルダへ移動するよ
$ trash -ctime +365 -exec mv {} $TRASH_DIR \;
  • 但し、起動ディスク以外のゴミ箱では、ボリューム間のコピー&削除になってしまう。もう少し工夫が必要。

ゴミ箱を削除日を基準に操作するAppleScript

  • ctimeを基準に自在に操作するにはコマンドから処理するしかない。
  • しかし、上記のようなコマンドは数ヶ月もすると完全に忘れる...。
  • そこで、コマンドを忘れても使いこなせるAppleScriptにしておくのだ。
ゴミ箱を削除日順に表示する

 --ゴミ箱を削除日順に表示する
 tell application "Terminal"
   activate
   "ls -AlcTt ~/.Trash /Volumes/*/.Trashes/`id -u`;\\"
   result & return & "# ゴミ箱を削除日順に表示します。"
   do script result
 end tell

ゴミ箱に捨てて3日以内のファイルを抽出する

 (*
  *    ゴミ箱に捨てて3日以内のファイルを抽出する
  *      削除日(ctime)を基準に抽出する
  *)
 activate
 "---------- 抽出します ----------
 ゴミ箱に捨てて3日以内の項目
     -ctime -3
 
 ゴミ箱に捨てて3日以上経過した項目
     -ctime +3"
 display dialog result default answer "-ctime -3" with icon 1
 set option_ctime to result's text returned
 
 try
   do shell script "ls /Volumes/*/.Trashes/`id -u`"
   set option_dir to " ~/.Trash /Volumes/*/.Trashes/`id -u`"
 on error
   set option_dir to " ~/.Trash"
 end try
 
 tell application "Terminal"
   activate
   "find" & option_dir & " -maxdepth 1 -mindepth 1 " & option_ctime & ";\\"
   result & return & "# ゴミ箱に捨てて" & my text_from_ctime(option_ctime)
   do script result
 end tell
 
 on text_from_ctime(option_ctime)
   set my text item delimiters to space
   set ctime to option_ctime's text items's item 2
   set my text item delimiters to ""
   set mark to ctime's item 1
   set num to ctime's items 2 thru -1 as text
   if mark = "-" then
     num & "日以内の項目"
   else if mark = "+" then
     num & "日以上経過した項目"
   end if
 end text_from_ctime

ゴミ箱に捨てて1年以上経過したファイルを削除する

 (*
  *    ゴミ箱に捨てて1年以上経過したファイルを削除する
  *      削除日(ctime)を基準に移動・削除する
  *        ~/.Trash/ については、$TMPDIR/年月日時分秒/* へ移動(mv)する
  *        /Volumes/*/.Trashes/`id -u`/ については、すぐ削除(rm)する
  *)
 activate
 "---------- 削除します ----------
 ゴミ箱に捨てて1年以上経過した項目
     -ctime +365"
 display dialog result default answer " -ctime +365" buttons {"キャンセル", "削除"} with icon 1
 set option_ctime to result's text returned
 
 set empty_trash_dir to do shell script "echo \"${TMPDIR}empty_trash_`date '+%Y%m%d%H%M%S'`\""
 set option_rm to " -exec rm -fR {} \\;"
 set option_mv to " -exec mv {} " & empty_trash_dir's quoted form & " \\;"
 set button_name to "削除"
 set trash_dir to " ~/.Trash"
 
 try
   do shell script "ls /Volumes/*/.Trashes/`id -u`"
   set trashes_dir to " /Volumes/*/.Trashes/`id -u`"
   
   activate
   "この操作には取り消しできない操作が含まれます。
 何が削除されるか、確認できていますか?"
   display dialog result buttons {"キャンセル", "対象を確認", "削除"}
   set button_name to result's button returned
 on error err_msg number err_num
   if err_num = 1 then
     set trashes_dir to ""
   else
     error err_msg number err_num
   end if
 end try
 
 do shell script "find" & trash_dir & space & trashes_dir & " -maxdepth 1 -mindepth 1 " & option_ctime & ";\\"
 if result is not "" then
   tell application "Terminal"
     activate
     "find" & trash_dir & space & trashes_dir & " -maxdepth 1 -mindepth 1 " & option_ctime & ";\\"
     result & return & "# 以下のファイルやフォルダが削除対象です。"
     if button_name = "削除" then
       result & return & "mkdir " & empty_trash_dir's quoted form
       result & return & "find" & trash_dir & " -maxdepth 1 -mindepth 1" & option_ctime & option_mv & ";\\"
       result & return & "# ホームのゴミ箱(~/.Trash/)の削除対象を、一時フォルダ-Tmp-へ移動(mv)しました。"
       if trashes_dir is "" then
         result
       else
         result & return & "find" & trashes_dir & " -maxdepth 1 -mindepth 1" & option_ctime & option_rm & ";\\"
         result & return & "# ボリュームのゴミ箱(/Volumes/*/.Trashes/`id -u`/)の削除対象を、削除(rm)しました。"
       end if
       result & return & "open " & empty_trash_dir's quoted form & ";\\"
       result & return & "# 移動先の一時フォルダ-Tmp-を開きました。"
     else if button_name = "対象を確認" then
       result
     end if
     do script result
   end tell
 else
   activate
   "削除対象はありません。"
   display dialog result buttons {"OK"} giving up after 5
 end if

ゴミ箱を空にする時の移動先-Tmp-を開く

 --ゴミ箱を空にする時の移動先-Tmp-を開く
 do shell script "open $TMPDIR"

すぐに削除しないAutomatorサービス

f:id:zariganitosh:20101231170538p:image

 on run {input, parameters}
   
   (* Your script goes here *)
   my alert_trash_can_not_delete(input)
   tell application "Finder"
     if ":.Trash:" is in ((input's item 1) as text) or ":.Trashes:" is in ((input's item 1) as text) then
       my alert_this_operation_can_not_undo()
       move my with_startup_disk(input) to my tmp_trash()
       my rm(my without_startup_disk(input))
       my rm_sound()
     else
       delete input
     end if
   end tell
 end run
 
 --間違ってゴミ箱を削除しようとしている場合の警告
 on alert_trash_can_not_delete(alias_list)
   tell application "Finder"
     if alias_list's item 1's name is ".Trash" then
       beep
       activate
       "ゴミ箱は削除できません。"
       display dialog result buttons "キャンセル" default button 1 giving up after 5 with icon 2
       error -128 --強制終了
     end if
   end tell
 end alert_trash_can_not_delete
 
 --この操作は取り消しできない警告
 on alert_this_operation_can_not_undo()
   beep
   activate
   "選択中のファイルを完全に削除します。
  この操作は「取り消し」できません。"
   display dialog result default button 1 with icon 0
 end alert_this_operation_can_not_undo
 
 --起動時に削除される -Tmp-/Trash_年月日秒/ フォルダを作って返す
 on tmp_trash()
   tell application "Finder"
     if my os_version() < "10.7" then
       set _tmp_ to ((path to temporary items)'s folder as text) & "-Tmp-" as alias
     else
       set _tmp_ to ((path to temporary items)'s folder as text) as alias
     end if
     make new folder at _tmp_ with properties {name:"Trash_" & my datetime(current date)}
     result as alias
   end tell
 end tmp_trash
 
 on os_version()
   do shell script "defaults read /System/Library/CoreServices/SystemVersion ProductUserVisibleVersion"
 end os_version
 
 --日時を数字の羅列で返す
 on datetime(d)
   --"" & d's year & (d's month as number) & d's day & d's time--time=0時からの積算秒数
   "" & d's year & (d's month as number) & d's day & d's hours & d's minutes & d's seconds
 end datetime
 
 --起動ディスクのaliasだけ返す
 on with_startup_disk(alias_list)
   set res to {}
   repeat with f in alias_list
     if (f as text) begins with (path to startup disk as text) then
       set res's end to f
     end if
   end repeat
   res
 end with_startup_disk
 
 --起動ディスクではないaliasだけ返す
 on without_startup_disk(alias_list)
   set res to {}
   repeat with f in alias_list
     if (f as text) does not start with (path to startup disk as text) then
       set res's end to f
     end if
   end repeat
   res
 end without_startup_disk
 
 --rmコマンドを実行する
 on rm(alias_list)
   if alias_list's number > 0 then
     tell application "Terminal"
       activate
       --do script "rm -iR" & my args(alias_list) --削除する前に確認する( y で削除)
       do script "rm -fR" & my args(alias_list) --確認なしにすぐ削除する
     end tell
   end if
 end rm
 
 --alias_listcommand引数に変換する
 on args(alias_list)
   set args to {}
   repeat with f in alias_list
     set args's end to " \\" & return & f's POSIX path's quoted form
   end repeat
   args as text
 end args
 
 --削除した時の効果音
 on rm_sound()
   "afplay /System/Library/PrivateFrameworks/ScreenReader.framework/Versions/A/Resources/Sounds/MouseDrag.aiff"
   do shell script result
 end rm_sound

ゴミ箱の怪獣

  • かつて、MacOSのゴミ箱には怪獣が住んでいた。

D

f:id:zariganitosh:20101231173145p:image

  • 無駄かもしれないけど、こうゆうアプリに癒されていた頃が懐かしい。

果たして、これで後悔しない最高のゴミ箱になり得るのかどうか...。なんだか優柔不断に削除を先送りするゴミ箱のような気がしてきた。削除を先送りすると同時に、ゴミ箱に捨てる時の判断の精度を上げげることも重要だ。

当初の理想としては、Mail.appのようなゴミ箱を想像していた。Mail.appのゴミ箱のように、Finderでも完全に消去するタイミングを自由に設定できれば良いのに。さらに進んで、メディアの空き容量をチェックして、設定した空き容量以下になったら、古い削除日から順に自動的に消去してくれたら良いのに。

*1:もしかしたら、ファイル名の末尾にチルダ「~」や「.bak」を付加するのは、ゴミ箱の思想に近いのかもしれない。

*2:Finderの情報を見るから編集可能な情報

nobionobio 2012/09/15 00:38 僕は「追加された年月日時分秒をコメント欄に書き込むフォルダアクション」を、
「.trash」フォルダに設定しています。ただ、

・ゴミ箱に移動する時、本来の「.trash」フォルダではなく、「削除検討中」フォルダに移動する。
・ボリュームに十分な空き容量を確保できている間は、「削除検討中」フォルダにひたすら溜め込む。
・とにかく素早く削除したいファイルがある場合は、それを本来の「.trash」フォルダに送る。
・ゴミ箱は基本的に、即座に空にする。あるいは、システム起動時あるいは終了時に自動的に空にする。

……という運用の方が、もろもろシンプルではないか、という気もしています。
その場合、そんなフォルダアクションスクリプトも不要なわけですし。

ただ、「選択したアイテムを command + delete で .trash フォルダに送る」アプリは
Finder 以外にも、画像ビュワーとかいろいろあるので(iTunes もそうでしたっけ)、
その辺をどうするべきか、悩ましいところです。

zariganitoshzariganitosh 2012/09/15 05:10 nobioさん、

コメントありがとうございます!
ゴミ箱に移動する前にワンクッション入れるアイデアは、自分でも検討してみました。
しかし、以下のことを考えて、この時はゴミ箱を空にしない方式でやってみました。
・同じファイル名が重複したときの問題、
・別のボリューム(パーティション)や複数ユーザーで削除した時の管理の問題、
・(nobioさんも書かれているとおり)iTunesなどもファイルをゴミ箱に移動する問題
・TimeMachineのバックアップの問題
・「戻す」機能を実装する問題

ゴミ箱って、意外と高機能なんですよね。
でも頑張れば解決できるかもしれません。
最高の「削除検討中」フォルダ、ぜひ作ってみてください!

zariganitoshzariganitosh 2012/09/15 05:12 > 僕は「追加された年月日時分秒をコメント欄に書き込むフォルダアクション」を、「.trash」フォルダに設定しています。

なるほど!
フォルダアクションを使うと無駄がなくて良さそうです!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/zariganitosh/20110106/best_trash