Tengo un script ejecutado por un LaunchAgent para sincronizar un directorio con un recurso compartido remoto.
Este script es bastante simple, lo incluiré aquí solo para que nadie sospeche del script.
#!/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
Y se inicia desde este LaunchAgent que se instala en ~/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>
Este sistema ha estado funcionando durante un tiempo, pero desde que el usuario actualizó a Mavericks ha tenido problemas con la sincronización de cualquier archivo que tenga el atributo oculto establecido.
Por lo tanto, el archivo es visible en Finder cuando se edita, pero una vez que se ha sincronizado con el recurso compartido, recibe el atributo oculto en el recurso compartido y ya no se puede ver cuando se navega por el recurso compartido en Finder.
Solo con el shell se puede ver, también ls -O
muestra que tiene el atributo oculto.
Conectándome al mismo recurso compartido SMB2 utilizando una PC con Windows puedo ver todos los archivos, por lo que este atributo oculto solo está en Mavericks. También puedo des-ocultar los archivos de una PC con Windows, lo cual es aún más extraño.
Los archivos que están ocultos en Mavericks se muestran en el cliente de Windows con un color ligeramente diferente, hasta que desactivo la marca oculta en ellos y vuelven a la normalidad tanto en el cliente de Windows como en los Mavericks.