Cómo escanear una carpeta en busca de subcarpetas y copiar un archivo en cada salida

2

Estoy teniendo un pequeño problema aquí. Esta es la situación: implementaremos una nueva aplicación pronto, y la configuración del servidor reside en un archivo XML simple, ubicado en un lugar profundo del ~/library/Preferences . Quiero crear un script bash / shell que básicamente copiará el archivo XML en el lugar correcto, pero para cada carpeta de usuario que exista.

Pude usar el siguiente script para Windows, pero me pregunto si hay algo similar para Apple.

Aquí está el script 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! :)

    
pregunta Alex Pilon 22.08.2016 - 23:00

2 respuestas

3

Bueno, aquí hay algo con lo que puedes trabajar. No se ha probado en un entorno real y se ofrece TAL CUAL, sin ninguna 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 la sugerencia de bmike

# 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
    
respondido por el fd0 23.08.2016 - 19:08
0

Escribir un archivo de preferencias es una forma incorrecta de hacer cosas en OS X. Especialmente en 10.9 y versiones posteriores, donde las preferencias se almacenan en caché y el archivo ni siquiera se puede usar.

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

Entonces, en cualquier lugar en el que escribiría código para manejar las escrituras de archivos, simplemente escriba la preferencia utilizando la API. En cualquier lugar que usaría un script para copiar o escribir un archivo, use ese script para llamar a defaults y establezca las cosas de manera apropiada.

Aquí hay una búsqueda en GitHub para mostrarle ejemplos de cómo usar defaults write para comenzar: enlace ✓

la razón para no escribir un archivo XML en cada cuenta de usuario es la separación de privilegios. Debe manejar las nuevas cuentas de usuario creadas después de ejecutar su secuencia de comandos, necesita derechos de administrador y no derechos de usuario que interrumpirán un subconjunto de los flujos de trabajo de su usuario e impedirán la adopción de su aplicación. Existe un marco para escribir las preferencias a nivel del sistema para una aplicación y luego para que un usuario anule o personalice esas configuraciones; mi consejo es usar esos marcos y hacer su vida más fácil como desarrollador de software que se ejecuta en OS X.

    
respondido por el bmike 23.08.2016 - 00:52

Lea otras preguntas en las etiquetas