web-dev-qa-db-ja.com

macOS用のクリーンアップスクリプト

何十人ものユーザーがいる共有Macワークステーションがたくさんあります。これらのユーザーは常に大きなファイルをデスクトップとゴミ箱に残し、最終的にローカルハードドライブをいっぱいにします。設定した日数より古いデスクトップファイルとフォルダーを削除し、すべてのユーザーのゴミ箱を空にする基本的なシェルスクリプトを作成したいと思います。これは私がこれまでに思いついたものです:

# Delete desktop files and folders older than 30 days
Sudo find /Users/*/Desktop/ -type d -or -type f ! -name '.DS_Store' ! 
-name '.localized' -mtime +30 -exec rm -rf '{}' +;

# Empty Trash for all users
rm -rf /Users/*/.Trash/*

このようなスクリプトで構文が間違っている潜在的な危険性を理解しています。私は自分のアカウントでこれを実行することをテストしました(*をユーザーに置き換えました)。ファイルに対しては機能しているようですが、デスクトップ上の古いフォルダーが削除されていません。これを実行するより良い方法があり、確認ダイアログで磨きをかけることができれば、何が問題になっているのだろうと思っています(つまり、「警告:これにより、30日以上経過したすべてのデスクトップファイルとフォルダが完全に削除されます、すべてのユーザーのゴミ箱を空にしてください!続行してもよろしいですか? ").

4
animism

ゴミ箱の自動削除

$ usernameに30日間の自動ゴミ箱削除オプションを設定するには:

Sudo -u $username bash -c 'defaults write com.Apple.Finder FXRemoveOldTrashItems -bool true'

ダイアログの提示

SIP対応のMojaveでダイアログ部分を機能させるには、各ユーザーがSystem Preferences> Security & Privacy> Privacy> Automationにエントリを入力して、ダイアログを表示するSystem Events.appへの端末アクセス。以下はosascriptを使用したもので、次のようになります。

macOS or OS X dialog from Shell script

ユーザーが[はい]をクリックすると、ダイアログの終了コードは0(ゼロ)になります。以下に示すように、ダイアログの成功した終了コードの知識をスクリプトに組み込むことができます。

#!/usr/bin/env bash
osascript -e 'tell app "System Events" to display dialog "Hi. I am automated script. May I delete Desktop & Trash files older than 30 days?" buttons {"Yes", "No"} with icon caution' >/dev/null 2>&1 

# $? is the exit code of the very last command that was executed (osascript).
#
if [ $? -eq 0 ]; then
    # Do something.
    echo "You clicked Yes."
fi

ファイルを見つける

以下では、名前が.DS_Storeまたは.localizedではなく、30日以上経過している特定のタイプ(ファイルおよびディレクトリ)のファイルを検索します。最初の行は安全なテストのためのものです。その下の行と入れ替えて、見つかったオブジェクトを削除します。オプションを複数回指定する必要がある場合は、-oを使用します。 (\)特殊文字は必ずエスケープしてください。括弧の最初と最後の空白も重要です。

#!/usr/bin/env bash
find "$HOME/Desktop" -type f -o -type d -mtime +30 \! \( -name '.DS_Store' -o -name '.localized' \) -print
# find "$HOME/Desktop" -type f -o -type d -mtime +30 \! \( -name '.DS_Store' -o -name '.localized' \) -exec rm -rf '{}' +

ユーザーの一覧表示

#!/usr/bin/env bash
# Getting a list of users, filtering out service accounts, root, daemon, and nobody...
users=$(dscl . list /Users | grep -v -e '_' -e 'root' -e 'daemon' -e 'nobody')

for user in "$users"; do
    # Do something.
    id "$user"
done

unset users

明らかに、これらのスニペットを作業スクリプトにステッチするために行う補間がいくつかありますが、少なくとももう少し洞察が得られることを願っています。それが私だったら、スクリプトを/usr/local/binに保存して、毎月スクリプトを実行するようにcronジョブを設定しようと思うかもしれません。

2
Christopher