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 lsusar 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,xargsy finalmenterm:Descompostura:
findherramienta versátil para buscar archivos y directorios y posiblemente ejecutar comandos en ellos*tener en cuenta elementos en la carpeta actual-maxdepth 0no busques en subcarpetas-type dbuscar 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 -nrordenar 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 -rfeliminar 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 -nrque sea efectiva. Tenga en cuenta que laawksintaxis 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_filele 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