mac

Speed Up rm files on Mac

Using rm -rf is slow on Mac, it's much faster on Linux. Something about Mac's filesystem, the journaling / metadata or something, I don't really know.


I made a script to autodelete things if I move them to a certain directory, and made a zsh function to move them:

# .zprofile

# usage: erm node_modules
erm() {
    mv -- "$1" "/opt/autoTrash/joe/"
}


I made a place for the script and the files:

sudo mkdir /opt/autoTrash
sudo mkdir /opt/autoTrash/joe


I put this in /opt/autoTrash/autoDelete.sh:

#!/bin/zsh

while true; do
  echo "Running cleanup..."
  find /opt/autoTrash/joe -mindepth 1 -delete
  echo "Cleanup completed."

  echo "Waiting for 30 seconds..."
  sleep 30
done


I created a plist file for it so it would run on boot:

sudo mkdir -p /Library/LaunchDaemons
nano /Library/LaunchDaemons/autoTrash.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>com.user.autoTrash</string>
   <key>ProgramArguments</key>
   <array>
      <string>/opt/autoTrash/autoDelete.sh</string>
   </array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

And I made sure the permissions were correct:

# ls -al /Library/LaunchDaemons
-rw-r--r--   1 root  wheel   388 Jun 20 16:29 autoTrash.plist

# ls -al /opt/autoTrash
total 16
drwxr-xr-x  7 root           wheel   224 Jun 20 20:06 .
drwxr-xr-x  5 root           wheel   160 Jun 20 20:56 ..
-rwxr--r--  1 root           wheel   182 Jun 20 20:28 autoDelete.sh
drwxr-xr-x  2 joe            staff    64 Jun 20 20:28 joe
-rw-r--r--  1 root           wheel  2240 Jun 20 20:44 startup.log


Debugging steps used:

# loading/unloading plist daemon manually:
sudo launchctl unload /Library/LaunchDaemons/autoTrash.plist
sudo launchctl load /Library/LaunchDaemons/autoTrash.plist

# linting plist to see if it's valid:
plutil -lint /Library/LaunchDaemons/autoTrash.plist

# Inside the autoDelete.sh script, temporarily, to see if it was running
exec &> /opt/autoTrash/startup.log

# Checking if it's still running:
ps -ef | grep autoTrash