Escribí un script que elimina todos excepto los dos últimos archivos en una carpeta:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Este script se ejecutará como un trabajo cron todos los días.
El razonamiento es como sigue:
Obtenga una lista de todos los archivos usando
ls -1
(para que obtenga un archivo por línea);Elimine los dos últimos de la lista usando
head -n -2
;Dado que
ls
imprime rutas relativas, use el elementoxargs printf
para anteponer la ruta de la carpeta y convertirla en una ruta absoluta;Envíalos a
sudo rm -rf
usarxargs
.
Todos tienen acceso a esta carpeta, por lo que cualquiera puede crear y eliminar cualquier archivo en esta carpeta.
El problema es: sudo rm -rf
da miedo. xargs sudo rm -rf
Es increíblemente aterrador.
Quiero asegurarme de que nadie pueda dañar otras carpetas / sistemas creando archivos inteligentes que se eliminen (ya sea accidentalmente o a propósito). No sé, algo inteligente como:
file with / spaces.txt
lo que podría resultar en un súper miedo sudo rm -rf /
.
EDITAR: Mi error, los nombres de archivo no pueden contener /
, por lo que este problema específico no sucedería, pero la pregunta sobre si existen otros riesgos o no.
Es por eso que estoy usando --quoting-style=shell-always
, esto debería evitar cualquier truco con archivos con espacios. Pero ahora me pregunto si alguien podría ser más inteligente con espacios y comillas en el nombre de archivo, tal vez.
¿Es seguro mi script?
Nota: Lo necesito sudo
porque estoy accediendo a la carpeta de forma remota (desde una unidad de red asignada usando mount
), y no pude hacer que funcione sin sudo.
/
Puedo crear un archivo con el personaje en el nombre? Estoy tratando de lograr esto aquí
ls
salida, este ya es un comando mal escrito, incluso con comillas. ls
creo que también usa la configuración regional para ordenar el orden, así que no veo cuál es el propósito de head
eliminar los últimos 2 (a menos que estés tratando de deshacerte .
y de ..
qué iirc no están permitidos como argumentos de rm
todos modos. Solo usa find /path/to/folder -type f delete
. Y no sudo
si se ejecuta desde cron - cron ya está en el nivel raíz
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?