He visto algunos liners usando ls, pero me gustaría evitar eso.
Estoy escribiendo un script que copia el código a mi servidor en una carpeta con marca de tiempo. La versión 'actual' siempre está vinculada a una ruta constante. De esa manera, puedo retroceder si algo sale mal. Ahora, cada implementación crea una nueva carpeta, pero me gustaría conservar solo las 3 últimas.
Aquí está mi versión actual:
ls -tp | grep '/$' | grep -v 'current\|shared' | tail -n +4 | xargs -d '\n' rm -rf --
Esto se ejecuta en la carpeta que contiene, excluye los archivos y las dos carpetas 'actual' y 'compartida' que quiero mantener (actualmente el enlace simbólico mencionado anteriormente), y elimina todos menos los 3 más nuevos según lo ordenado ls -t
.
¿Hay alguna forma de hacerlo sin ls
usar solo bash y la cadena de herramientas gnu?
Todas las carpetas destinadas a la poda se nombran siguiendo este formato:
$timestamp.$branch.$sha1
Donde SHA1 y branch son información de git sobre qué se implementó exactamente.
El servidor ejecuta Ubuntu Xenial.
Editar: proporcione algunos ejemplos de cómo se ven las carpetas
Aquí hay una lista de la carpeta de implementación, cómo se ve ahora:
drwxr-x--- 13 app www-data 4096 Mar 29 00:10 1490738956.develop.b806/
drwxr-x--- 13 app www-data 4096 Mar 29 00:19 1490739485.develop.ae01/
drwxr-x--- 14 app www-data 4096 Mar 29 03:33 1490751118.develop.f5b0/
lrwxrwxrwx 1 app www-data 40 Mar 29 03:33 current -> /home/app/deploy/1490751118.develop.f5b0/
drwx------ 5 app root 4096 Mar 10 04:12 shared/
fuente
Respuestas:
¿Cómo eliminar todas las 3 subcarpetas más recientes de una carpeta?
Puede hacer uso de
find
,sort
,awk
,xargs
y finalmenterm
:Descompostura:
find
herramienta versátil para buscar archivos y directorios y posiblemente ejecutar comandos en ellos*
tener en cuenta elementos en la carpeta actual-maxdepth 0
no busques en subcarpetas-type d
buscar directorios-not -path "current"
excluir el directorio llamado "actual"-not -path "shared"
excluir el directorio llamado "compartido"-printf "%T@ %p\n"
imprima los resultados, agregando la marca de tiempo delante de los nombres de directorio. Esto podría omitirse en su caso, ya que los directorios ya tienen una marca de tiempo.| sort -nr
ordenar la lista de acuerdo con la marca de tiempo, en orden inverso| awk 'NR > 3 {print $2}'
imprima todos menos los primeros tres resultados, omitiendo la marca de tiempo que se agregó anteriormente. Aquí es donde elige cuántos guardar, simplemente sustituya el número3
| xargs rm -rf
eliminar esos directorios y todo su contenidoEditar: en su caso, dado que los nombres de los directorios ya comienzan con una marca de tiempo, no es necesario volver a agregar la marca de tiempo para
sort -nr
que sea efectiva. Tenga en cuenta que laawk
sintaxis debe editarse en consecuencia.Referencia: vea estas dos preguntas y respuestas útiles / similares.
fuente
En su forma más básica
Tomado de https://serverfault.com/questions/122824/linux-using-find-to-locate-files-older-than-date
! -newer some_file
le dice que coincida con algo no más nuevo que 'some_file'-name \*.develop.\*
le dice que solo coincida con los nombres que coinciden con este patrón (* .develop. *)-delete
- Espero que esto no requiera explicación, ¡ ten cuidado! (¡Usa -print cuando pruebes!)-type d
- solo directorios-maxdepth 0
- No recurrir a subcarpetas.fuente