1 votos

Eliminar carpetas pequeñas menos de 50 MB con espacios en el nombre de

Cómo hago para borrar todas las carpetas de un directorio que son menores de 50 MB en total en el tamaño? Los directorios tienen espacios y caracteres especiales en sus nombres, pero no hay saltos de línea. No puede ser sub-directorios dentro de los directorios, por lo que sólo tiene el tamaño del primer nivel de directorios y buscando a menos de 50 MB en total en tamaño.

Directory Example:
/test
--/test/Example
--/test/Example 2
--/test/Sample Directory Inside (2018)
--/test/Sample & Test Directory
--/test/Sample/Inside Directory

Se debe encontrar todos los directorios en el /lugar de la prueba de menos de 50 MB de tamaño y borrar ese directorio. Gracias de antemano por su ayuda.

2voto

Spas Spasov Puntos 305

Aquí es un simple script de Bash que utiliza el comando du para obtener el tamaño de directorio:

#!/bin/bash

TARGET_DIR="/test"

# For each sub dir in $TARGET_DIR
for dir in "$TARGET_DIR"/*/
do
    # If the result of the command substitution $(...) is lower or equal to 50000
    if [[ $(du -s "$dir" | awk '{print $1}') -le 50000 ]]
    then
        # Do (remove `echo' to apply the action):
        echo rm -rf "$dir"
    fi
done
  • Lo que la sustitución de comandos es:

    • du -s - muestra sólo un total para cada argumento.
    • | - tubo de la salida de la anterior a la entrada estándar del comando siguiente
    • awk '{print $1}' - salida será sólo el primer campo
  • Alternativamente, usted puede usar la aritmética de la expresión:

    if (( "$(du -s "$dir" | awk '{print $1}')" <= 50000 )); then rm -rf "$dir"; fi
    
  • Se puede jugar también con la du opciones: por ejemplo, añada -m (fuente) y modificar la condición:

    if (( "$(du -sm "$dir" | awk '{print $1}')" <= 50 )); then rm -rf "$dir"; fi
    
  • La versión anterior de la respuesta: https://askubuntu.com/revisions/1073858/2

1voto

Rouven Volkmann Puntos 51

One-liner usando find:

find /test -mindepth 1 -type d -prune \
  -exec sh -c '[ $(du -s "$1" | awk "{print \$1}") -lt 50000 ] && echo rm -Rf "$1"' _ {} \;

Quitar el echo frente a rm si funciona para usted.

Explicación:

  • find /test -mindepth 1 -type d -prune encontrar todos los directorios en /prueba (y no descienden en los directorios que se eliminan).
  • -exec sh -c 'cmd "$1"' _ {} \; de ejecución cmd con la ruta de la carpeta ({}) como argumento $1.
  • [ $(du -s "$1" | awk "{print \$1}") -lt 50000 ] && rm -Rf "$1" Compruebe el tamaño del directorio y eliminar si es menor de 50.000 byte (50M).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: