¿Cómo eliminar todas las subcarpetas X más recientes de una carpeta?

1

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/
mkaito
fuente
1
¿Puedes agregar algunos nombres de muestra?
choroba
Buscar devolverá elementos más nuevos que 'x' donde x es un archivo. Usted crea el archivo con la marca de tiempo que necesita usando el tacto.
djsmiley2k
Según su explicación, parece que desea "eliminar todas las 3 subcarpetas más recientes de una carpeta". ¿Es esto correcto? Si es así, debe editar el título en consecuencia, de lo contrario, agregue más información.
simlev

Respuestas:

1

¿Cómo eliminar todas las 3 subcarpetas más recientes de una carpeta?

Puede hacer uso de find, sort, awk, xargsy finalmente rm:

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" -printf "%T@ %p\n" | sort -nr | awk 'NR > 3 {print $2}' | xargs rm -rf

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 contenido

Editar: 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 la awksintaxis debe editarse en consecuencia.

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" | sort -nr | awk 'NR > 3 {print $0}' | xargs rm -rf

Referencia: vea estas dos preguntas y respuestas útiles / similares.

simlev
fuente
1
Buena solución, no estoy seguro de quién ninja había quién ...
djsmiley2k
0

En su forma más básica

touch -t 201003160120 some_file
find . -maxdepth  0 -type d ! -newer some_file -name \*.develop.\* -delete

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.

djsmiley2k
fuente
Agregué un listado de ejemplo a la pregunta. ¿Ayuda eso a proporcionar una mejor respuesta?
mkaito
2
Me gusta su respuesta, pero en mi opinión, el OP está preguntando cómo mantener el elemento X más reciente, donde X es un número. Más tarde agrega que X = 3.
simlev
Siempre podía sustituir el tercer archivo, pero sí ... eso no estaba allí antes: P
djsmiley2k