2 votos

Nuevo intentando escribir un script simple para automatizar comando

De vez en cuando tengo que limpiar espacio eliminando imágenes antiguas y lo hago manualmente yendo a varios directorios para hacer esto. Quería hacer un script simple para hacer esto y he creado lo siguiente (y lo he hecho ejecutable con CHMOD) pero obtengo un error; "bash: snapshot_remove: comando no encontrado"

¿Qué estoy haciendo mal, por favor?

Aquí está mi script;

#!/bin/bash
cd /home/web2py/web2py_apps/snapshots/
cd 1
find -type f -mtime +25 -delete
cd ..
cd 2
find -type f -mtime +25 -delete
cd ..
cd 3
find -type f -mtime +25 -delete
cd ..
cd 4
find -type f -mtime +25 -delete
cd ..
cd 5
find -type f -mtime +25 -delete
cd ..
cd 0
find -type f -mtime +25 -delete
cd ..
cd 7
find -type f -mtime +25 -delete
cd ..
cd 9
find -type f -mtime +25 -delete
cd ..
cd 10
find -type f -mtime +25 -delete
cd ..
cd 11
find -type f -mtime +25 -delete
cd 12
find -type f -mtime +25 -delete
cd ..
cd 13
find -type f -mtime +25 -delete
cd ..
echo ** Eliminación de instantáneas completada **
df
exit

:end

4voto

Andy Griffiths Puntos 1

Si este script se llama snapshot_remove, necesitas ejecutarlo como ./snapshot_remove en su directorio padre. Tiene que tener un prefijo con el directorio ya que el directorio no estará en el $PATH por defecto. bash no ejecutará scripts en el directorio actual a menos que se le indique específicamente que lo haga.

echo debería citar la cadena de salida, de lo contrario se imprimirán cosas extrañas.

También tiene un error en el comando find, le falta el directorio base. Debería ser

find ./ -type f -mtime +25 -delete

Además de eso, puedes simplificar tu script de la siguiente manera, asumiendo que tienes una lista fija de subdirectorios que deseas limpiar:

#!/bin/bash
cd /home/web2py/web2py_apps/snapshots/
for subdirectory in 1 2 3 4 5 0 7 9 10 11 12 13 ; do
    find ./$subdirectory -type f -mtime +25 -delete
done
echo '** Eliminación de snapshots completa **'
df
exit

Nota. Asegúrate de tener una copia de seguridad buena y familiarízate con el script. Aunque he probado el código, no estoy en tu entorno, así que los resultados pueden variar.

1voto

Joel Puntos 112

La respuesta de Andy es correcta en mi opinión. Estoy añadiendo esta respuesta para proporcionar algunas alternativas que tal vez desees considerar:

Hay dos aspectos en tu pregunta: 1) el aspecto del PATH en relación con la ubicación de tu script (snapshot_remove), y 2) la sintaxis del propio script. Según entiendo tu pregunta y el mensaje de error que has publicado, parece que el aspecto principal está relacionado con tu PATH; es decir, la variable que define dónde el sistema busca los comandos ejecutables que introduces.

Empezaremos abordando el aspecto del PATH:

La variable de entorno PATH es la clave para parte de tu pregunta. PATH determina dónde buscará el sistema (en qué carpetas) el "comando" que introduces. Parece que tu script está ubicado en una carpeta que no está incluida en tu $PATH. Esto explicaría tu mensaje de error:

"bash: snapshot_remove: comando no encontrado"

Tienes dos (2) opciones para resolver este error:

  1. mover tu script a una carpeta que esté en tu PATH, o
  2. modificar tu variable de entorno PATH para incluir la carpeta que contiene snapshot_remove

Comencemos con la Opción 1: Mover tu script:

Abre un Terminal y escribe echo $PATH en el indicador para ver lo que contiene. Con suerte, contendrá la carpeta usr/local/bin. Si no lo hace, podría haber varias razones por las que no está (¿Apple pudo haber sido inconsistente??), pero el problema se soluciona fácilmente como se muestra en el Anexo: Cómo modificar /etc/paths.

Tradicionalmente, en una configuración de sistema tipo Unix, la carpeta usr/local/bin (o quizás /usr/local) sería la ubicación preferida para archivos ejecutables de origen local, como tu script snapshot_remove. Esta ubicación está en conformidad con el "Estándar de Jerarquía de Sistemas de Archivos". Por lo tanto, podrías colocar tu script en esa carpeta y olvidarte de todo lo demás asociado con actualizar tu variable de entorno PATH.

Opción 2: Modificar tu variable de entorno PATH

La alternativa a colocar tu script en /usr/local/bin es modificar la variable de entorno PATH en tu entorno. Supondré que tu script está en tu carpeta Usuarios (Usuarios/quientuseas). Puedes añadir esa carpeta a tu variable de entorno PATH como un cambio temporal, o puedes agregarlo como un cambio permanente:

Cambio temporal:

Asumiendo que estás usando zsh, haz esto desde Terminal:

path+=/Usuarios/quientuseas

# O...

path+=/Usuarios/quienquiera/mismyscripts

Cambio permanente:

Abre tu editor favorito y añade lo siguiente a .zshrc (o .bashrc si usas bash):

cd /Usuarios/quienquiera
nano .zshrc
#
# añade una línea:

export PATH=/Usuarios/quienquiera:$PATH

NOTA: Se ha informado que Apple no incluye un archivo ~/.zshrc. Si este es tu caso, simplemente crea el archivo tú mismo y modifícalo como se describe arriba.

Ahora abordemos el aspecto de la "sintaxis del script":

Según entiendo tu script, estás usando find para eliminar todos los archivos en una serie de carpetas que fueron modificados hace más de 25 horas. Si entendí correctamente tu objetivo, entonces sigue leyendo.

find parece una elección razonable para este objetivo. Creo que la respuesta de Andy ofrece sugerencias razonables que simplificarán tu script. No estoy muy bien situado para abordar este aspecto ya que no he usado la versión de find de Apple por muchos años (yo uso la versión de find GNU de MacPorts). Pero puedo sugerir algo en esta línea (usar -tipo f y -mindepth 1 juntos quizás sea demasiado cauteloso):

find /home/web2py/web2py_apps/snapshots/ -mindepth 1 -tipo f -mtime +25 -delete

Estoy ignorando tu uso de /home, que en mi conocimiento no existe en macOS.

También podría recomendarte mver los archivos a una carpeta en /tmp - en lugar de -delete (es decir, -execdir mv f /tmp/X). Esto te daría la oportunidad de reconsiderar esas eliminaciones antes de hacerlas permanentes. En cualquier caso, te sugiero reemplazar -delete con -print para verificar que las cosas funcionen correctamente en todos los casos.

Y por último, te recomendaría que leas esta (buena y razonable) explicación sobre cómo se interpreta mtime. Creo que esta explicación se aplica a la versión GNU de find, pero no sé si también se aplica a la versión de Apple (es decir, /usr/bin/find).



Anexo: Cómo modificar /etc/paths

Abre el archivo /etc/paths en tu editor favorito (también conocido como /private/etc/paths). Supongo que nano es tu editor aquí, pero sustituye por lo que uses en lugar de eso. También ten en cuenta: Si no tienes configurado sudo, puedes hacerlo ingresando el comando sudo visudo en Terminal. Una vez que puedas usar sudo:

sudo nano /etc/paths
#
# añade una línea al archivo:

/usr/local/bin

# guarda y sale del editor

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