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

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/*

私はこのようなスクリプトで構文エラーが発生する可能性がある潜在的なリスクを理解しています。私のアカウントでのみこの実行をテストし(*を私のユーザーに置き換えて)、ファイルでは機能しているように見えますが、私のデスクトップの古いフォルダは削除されません。私が間違っているかどうか疑問に思っていて、より良い方法がある場合は、[確認]ダイアログボックスでいくつかの改善を追加することもできます。 」と空白)。すべてのユーザーのためのごみ箱です。続行できますか?」)。

答え1

自動的にジャンクを削除

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

sudo -u $username bash -c 'defaults write com.apple.finder FXRemoveOldTrashItems -bool true'

現在の会話

SIP サポート Mojave でダイアログ部分が機能するには、各ユーザーが >>>System Preferencesに項目を入力してダイアログを表示するための端末アクセスを許可する必要があります。以下のようにこれを使用する1つの方法があります。Security & PrivacyPrivacyAutomationSystem Events.apposascript

シェルスクリプトのmacOSまたはOS Xダイアログボックス

ユーザーが「はい」をクリックすると、ダイアログの終了コードはゼロです。次のように、ダイアログボックスの正常終了コードに関する情報をスクリプトと組み合わせることができます。

#!/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以下の名前が.localized30日を超える特定の種類のファイル(ファイルとディレクトリ)を見つけます。最初の行はセキュリティテスト用です。見つかったオブジェクトを削除するには、以下の行を置き換えます。オプションを複数回指定する必要がある場合は、特殊文字を-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た後、クローンジョブを設定して毎月実行してみることもできるようです。

関連情報