Ho uno script eseguito da un LaunchAgent per sincronizzare una directory con una condivisione remota.
Questo script è abbastanza semplice, lo includerò qui in modo che nessuno sospetti la sceneggiatura.
#!/bin/bash
# Hjälpskript för att ta backup.
# Endast för Mac OS, kommandon som stat, date och nc har annat syntax
# på Linux.
# Av Stefan Midjich
# REDIGERA DEN HÄR SÖKVÄGEN
backupTarget='/Volumes/myuser'
# REDIGERA ENDAST HÄR UNDER OM DU VET VAD DU GÖR
destinationFormat="sync" # backar som standard till YYYY-MM kataloger, en för varje månad
rsyncPort=22 # som standard antar vi att rsync använder ssh på port 22
purge=0 # som standard rensas inget gammalt
purgeDate='-2m' # standard: idag minus 2 månader
hostPattern='^([^:]+):(\/?.*)' # matcha värdnamn och sökväg från backupTarget
# Avsluta direkt om mål-katalogen inte existerar
if [[ ! "$backupTarget" =~ $hostPattern && ! -d "$backupTarget" ]]; then
echo "Backup target looks like directory that is not found" 1>&2
exit 1;
elif [ -n "${BASH_REMATCH[1]}" ]; then
# Här har vi hittat vad som ser ut att vara ett värdnamn i backupTarget.
# Så vi ska kontrollera att värden går att kontakta.
remoteHost=${BASH_REMATCH[1]}
if ! nc -z -w 5 "$remoteHost" $rsyncPort >/dev/null 2>&1; then
echo "Can't connect to target host on port $rsyncPort" 1>&2
exit 1
fi
fi
# Ta backup av samtliga argument som är
# existerande kataloger.
for syncDir in $@; do
if [ -d "$syncDir" ]; then
# Lägg till --delete efter -a om rsync även ska radera i
# destinationskatalogen. Annars sparas allt gammalt som raderas i
# källkatalogen.
rsync --exclude 'Microsoft *' -aS "$syncDir" "${backupTarget}/$destinationFormat/"
fi
done
# Rensa allt som är äldre än purgeDate endast
# om purge är högre än 0.
if (($purge >= 1)); then
purgeTime=$(date -v"$purgeDate" '+%s')
for targetDir in "${backupTarget}/*"; do
lastModified=$(stat -f '%m' "$targetDir")
if (($lastModified < $purgeTime)); then rm -rf "$targetDir"; fi
done
fi
E viene avviato da questo LaunchAgent installato in ~/Library/LaunchAgents
.
<?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>org.myuser.syncDir</string>
<key>ProgramArguments</key>
<array>
<string>/Users/myuser/bin/syncDir.sh</string>
<string>/Users/myuser/Documents</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Users/myuser/Documents</string>
<string>/Volumes</string>
</array>
</dict>
</plist>
Questo sistema ha funzionato da un po 'di tempo, ma da quando l'utente si è aggiornato a Mavericks ha avuto problemi con qualsiasi file sincronizzato con l'attributo nascosto impostato alla sincronizzazione.
Quindi il file è visibile in Finder quando viene modificato, ma una volta sincronizzato sulla condivisione riceve l'attributo nascosto sulla condivisione e non può più essere visto durante la navigazione nella condivisione in Finder.
Si può vedere solo usando la shell, anche ls -O
mostra che ha l'attributo hidden.
Connessione alla stessa condivisione SMB2 utilizzando un PC Windows Posso vedere tutti i file, quindi questo attributo nascosto è solo in Mavericks. Posso anche rimuovere i file da un PC Windows, il che è ancora più strano.
I file che sono nascosti su Mavericks sono mostrati sul client Windows con un colore leggermente diverso, fino a quando non disattivo il flag nascosto su di essi e tornano alla normalità sia su client Windows che su Mavericks.