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

나는 이와 같은 스크립트에서 구문 오류가 발생할 수 있는 잠재적 위험을 이해합니다. 내 계정에서만 이 실행을 테스트했으며(*를 내 사용자로 대체) 파일에서는 작동하는 것처럼 보이지만 내 바탕 화면의 이전 폴더는 삭제되지 않습니다. 내가 뭘 잘못하고 있는지 궁금하고 더 좋은 방법이 있다면 확인 대화 상자를 통해 약간의 개선을 추가할 수도 있습니다(예: "경고: 이 작업을 수행하면 30일보다 오래된 모든 데스크톱 파일과 폴더가 영구적으로 삭제됩니다." 및 비어 있음). 모든 사용자를 위한 휴지통입니다. 계속할 수 있습니까?").

답변1

자동으로 정크 제거

$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 또는 OS X 대화 상자

사용자가 "예"를 클릭하면 대화 상자의 종료 코드는 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아래에서 이름 이 .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한 후 크론 작업을 설정하여 매달 실행해 볼 수도 있을 것 같습니다.

관련 정보