Tengo un script ejecutado por un LaunchAgent para sincronizar un directorio con un recurso compartido remoto.
Este script es bastante sencillo, lo incluiré aquí sólo 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 lanza 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 estado teniendo problemas con cualquier archivo que se sincroniza teniendo el atributo oculto establecido en la sincronización.
Así que el archivo es visible en Finder cuando se está editando, pero una vez que se ha sincronizado con el recurso compartido recibe el atributo de oculto en el recurso compartido y ya no se puede ver al navegar por el recurso compartido en Finder.
Sólo usando la cáscara se puede ver, también ls -O
muestra que tiene el atributo oculto.
Al conectarme al mismo recurso compartido SMB2 utilizando un PC con Windows puedo ver todos los archivos, por lo que este atributo oculto es sólo en Mavericks. También puedo desocultar los archivos desde un 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 les quito la bandera de oculto y vuelven a la normalidad tanto en el cliente de Windows como en Mavericks.