2 votos

Cómo escanear a una carpeta y sus subcarpetas y copiar un archivo para cada salida

Estoy teniendo un poco de un problema aquí. He aquí la situación: vamos a ser la implementación de una nueva aplicación de pronto, y la configuración del servidor reside en un simple archivo XML, que se encuentra en algún lugar profundo en el ~/library/Preferences. Quiero crear un bash/script de shell que básicamente copiar el archivo XML en el lugar correcto, pero para cada carpeta de usuario que existe.

Yo era capaz de utilizar la siguiente secuencia de comandos para Windows, pero me pregunto si hay algo similar para Apple.

Aquí está la secuencia de comandos de Windows:

$sourceLocation = "C:\Users\suptech\Downloads\TEMP"

$targetLocation = "C:\Users"

$result = @()

$result += get-ChildItem $targetLocation | Where-Object {$_.PSIsContainer}  
$result | foreach-Object { copy-item $sourceLocation -Destination "C:\Users\$_\AppData\Roaming\TEST" -Recurse -Force}

Podría alguien ayudarme ?

Gracias de antemano! :)

3voto

Michael Zhou Puntos 167

Bueno, aquí hay algo que usted puede trabajar. No está probado en un entorno del mundo real y se ofrece COMO es - sin ningún tipo de garantía.

# This script must run as root
if [ "$(id -u)" != "0" ]
then
    echo "This script must be run as root"
    exit 1
fi

source=/path/to/file
destination=Library/path/to/destination/directory

for u in /Users/*
do
    on=${u##*/}

    # If not a directory- do not process
    [ ! -d "$u" ] && continue

    # Check that the directory has a valid user name or do not process
    id "$on" >/dev/null 2>&1 || continue

    # Get the user's primary group id
    gn=$(id -gn "$on")

    # bug fix found by Alex Pilon
    # make destination directory if it doesn't exist
    install -o "$on" -g "$gn" -d "${u}/${destination}"

    install -b -o "$on" -g "$gn" -m 644 "$source" "${u}/${destination}"
done

Otra solución basada en bmike sugerencia

# This script must run as root
if [ "$(id -u)" = "0" ]
then
    : running as root
else
    echo "This script must be run as root"
    exit 1
fi

source=/path/to/file
destination=Library/path/to/destination/directory 

dscl . -list /Users NFSHomeDirectory |
awk 'BEGIN { OFS=":" } / \/Users/ { print $1, $2}' |
while IFS=: read u hdir
do
    # Get the user's primary group id
    gn=$(id -gn "$u")

    install -o "$u" -g "$gn" -d "${hdir}/${destination}"    

    install -b -o "$u" -g "$gn" -m 644 "$source" "${hdir}/${destination}"
done

0voto

Oskar Puntos 1242

Escritura de un archivo de preferencias es la manera incorrecta de hacer las cosas en OS X. Especialmente en 10.9 y más tarde en las preferencias se almacenan en caché y el archivo no puede incluso ser utilizado.

Usted querrá usar defaults delete a eliminar las preferencias y defaults write para establecer las preferencias y dejar que el sistema operativo decidir dónde / cómo almacenar la caché y la configuración.

Así que - en cualquier lugar que escribir código para manejar las escrituras de archivos, sólo tiene que escribir la preferencia de uso de la API. En cualquier lugar que usar un script para copiar o escribir un archivo, utilice el script para llamar a defaults y el conjunto de las cosas adecuadamente.

Aquí está una GitHub de búsqueda para mostrar bash ejemplos de uso defaults write para comenzar: https://github.com/search?l=bash&q=defaults+escribir&ref=searchresults&tipo=Codigo&utf8=

la razón para no escribir un archivo XML para cada cuenta de usuario es la separación de privilegios. Usted necesita para manejar las nuevas cuentas de usuario creadas después de ejecutar la secuencia de comandos, usted necesita derechos de administrador y no de derechos de usuario que se va a romper un subconjunto de tu usuario de los flujos de trabajo y se impide la adopción de su aplicación. Hay un marco para el sistema de escritura a nivel de las preferencias de una aplicación y, a continuación, para un usuario para desactivar o personalizar los ajustes - mi consejo es utilizar esos marcos y hacer su vida más fácil, como un desarrollador de software que se ejecuta en OS X.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X