Skip to content

find-large-files.sh

Niveau : Dรฉbutant

Recherche des ficyesterdays volumineux sur le systรจme.


Description

Ce script identifie les ficyesterdays volumineux : - Recherche par taille minimum - Filtrage par type de ficyesterday - Exclusion de rรฉpertoires - Affichage formatรฉ avec taille lisible


Prรฉrequis

  • Systรจme : Linux (RHEL/Debian)
  • Permissions : Utilisateur standard (sudo pour recherche depuis /)
  • Dรฉpendances : find, du, bc

Cas d'Usage

  • Nettoyage disque : Identification rapide des fichiers volumineux ร  supprimer ou archiver
  • Audit de stockage : Analyse de l'utilisation de l'espace disque par rรฉpertoire
  • Investigation de saturation : Diagnostic rapide lors d'alertes d'espace disque faible
  • Planification d'archivage : Identification des candidats pour migration vers stockage froid

Script

#!/bin/bash
#===============================================================================
# Script Name: find-large-files.sh
# Description: Recherche ficyesterdays volumineux
# Author: ShellBook
# Version: 1.0
#===============================================================================

set -euo pipefail

# Colors
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m'

# Configuration
MIN_SIZE="100M"
MAX_RESULTS=20
SEARCH_PATH="/"
EXCLUDE_PATHS=("/proc" "/sys" "/dev" "/run")
FILE_TYPE=""
SORT_BY="size"  # size ou time

usage() {
    cat << EOF
Usage: $(basename "$0") [OPTIONS] [PATH]

Recherche ficyesterdays volumineux.

Arguments:
    PATH            Chemin de recherche (default: /)

Options:
    -s, --size SIZE     Minimum size (default: 100M)
                        Formats: 10M, 1G, 500K
    -n, --number NUM    Nombre de rรฉsultats (default: 20)
    -t, --type EXT      Filtrer par extension (ex: log, tar.gz)
    -e, --exclude PATH  Exclure un chemin (peut รชtre rรฉpรฉtรฉ)
    --sort-time         Trier par date de modification
    -h, --help          Show this help

Examples:
    $(basename "$0")                        # Ficyesterdays > 100M depuis /
    $(basename "$0") -s 1G /home            # Ficyesterdays > 1G dans /home
    $(basename "$0") -t log -s 50M /var     # Logs > 50M dans /var
    $(basename "$0") -n 50 -s 500M          # Top 50 ficyesterdays > 500M
EOF
}

format_size() {
    local bytes=$1
    if (( bytes >= 1073741824 )); then
        printf "%.1fG" $(echo "scale=1; $bytes/1073741824" | bc)
    elif (( bytes >= 1048576 )); then
        printf "%.1fM" $(echo "scale=1; $bytes/1048576" | bc)
    elif (( bytes >= 1024 )); then
        printf "%.1fK" $(echo "scale=1; $bytes/1024" | bc)
    else
        printf "%dB" "$bytes"
    fi
}

build_exclude_args() {
    local args=""
    for path in "${EXCLUDE_PATHS[@]}"; do
        args="$args -path $path -prune -o"
    done
    echo "$args"
}

find_large_files() {
    local exclude_args=$(build_exclude_args)
    local type_filter=""

    if [[ -n "$FILE_TYPE" ]]; then
        type_filter="-name '*.$FILE_TYPE'"
    fi

    # Construction de la commande find
    local find_cmd="find $SEARCH_PATH $exclude_args -type f -size +$MIN_SIZE $type_filter -print0 2>/dev/null"

    # Exรฉcution et traitement
    eval "$find_cmd" | xargs -0 ls -la 2>/dev/null | \
        awk '{print $5, $6, $7, $8, $9}' | \
        sort -rn | \
        head -n "$MAX_RESULTS"
}

main() {
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            -s|--size)
                MIN_SIZE="$2"
                shift 2
                ;;
            -n|--number)
                MAX_RESULTS="$2"
                shift 2
                ;;
            -t|--type)
                FILE_TYPE="$2"
                shift 2
                ;;
            -e|--exclude)
                EXCLUDE_PATHS+=("$2")
                shift 2
                ;;
            --sort-time)
                SORT_BY="time"
                shift
                ;;
            -h|--help)
                usage
                exit 0
                ;;
            -*)
                echo "Unknown option: $1"
                usage
                exit 1
                ;;
            *)
                SEARCH_PATH="$1"
                shift
                ;;
        esac
    done

    # Validation
    if [[ ! -d "$SEARCH_PATH" ]]; then
        echo -e "${RED}Error:${NC} $SEARCH_PATH does not exist"
        exit 1
    fi

    # Header
    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
    echo -e "${GREEN}  RECHERCHE FICHIERS VOLUMINEUX${NC}"
    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
    echo -e "  Chemin: $SEARCH_PATH"
    echo -e "  Taille min: $MIN_SIZE"
    echo -e "  Limite: $MAX_RESULTS rรฉsultats"
    [[ -n "$FILE_TYPE" ]] && echo -e "  Type: *.$FILE_TYPE"
    echo -e "${CYAN}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}"
    echo ""

    echo -e "${YELLOW}Recherche en cours...${NC}"
    echo ""

    # Construction commande find
    local exclude_args=""
    for path in "${EXCLUDE_PATHS[@]}"; do
        exclude_args="$exclude_args -path $path -prune -o"
    done

    local name_filter="-type f"
    if [[ -n "$FILE_TYPE" ]]; then
        name_filter="$name_filter -name '*.$FILE_TYPE'"
    fi

    # Recherche
    local results
    results=$(find "$SEARCH_PATH" $exclude_args $name_filter -size +$MIN_SIZE -printf '%s %T+ %p\n' 2>/dev/null | \
              sort -rn | \
              head -n "$MAX_RESULTS")

    if [[ -z "$results" ]]; then
        echo -e "${YELLOW}Aucun ficyesterday trouvรฉ avec les critรจres spรฉcifiรฉs.${NC}"
        exit 0
    fi

    # Affichage formatรฉ
    printf "  ${CYAN}%-10s %-20s %s${NC}\n" "TAILLE" "MODIFIร‰" "FICHIER"
    printf "  %-10s %-20s %s\n" "------" "-------" "-------"

    local total_size=0
    local count=0

    echo "$results" | while read -r size date path; do
        count=$((count + 1))
        total_size=$((total_size + size))

        local formatted_size=$(format_size "$size")
        local formatted_date=$(echo "$date" | cut -d'+' -f1 | sed 's/T/ /')

        # Colorer selon la taille
        local color=$GREEN
        if (( size >= 1073741824 )); then
            color=$RED
        elif (( size >= 104857600 )); then
            color=$YELLOW
        fi

        printf "  ${color}%-10s${NC} %-20s %s\n" "$formatted_size" "$formatted_date" "$path"
    done

    # Rรฉsumรฉ
    echo ""
    echo -e "${CYAN}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}"

    # Calculer le total
    local total=$(echo "$results" | awk '{sum+=$1} END {print sum}')
    echo -e "  Total: ${GREEN}$(format_size $total)${NC} dans $(echo "$results" | wc -l) ficyesterdays"

    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
}

main "$@"

Usage

# Rendre exรฉcutable
chmod +x find-large-files.sh

# Recherche par dรฉfaut (ficyesterdays > 100M depuis /)
sudo ./find-large-files.sh

# Ficyesterdays > 1G dans /home
./find-large-files.sh -s 1G /home

# Top 50 ficyesterdays log > 50M dans /var
./find-large-files.sh -t log -s 50M -n 50 /var

# Exclure des chemins
./find-large-files.sh -e /backup -e /archive /

Sortie Exemple

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  RECHERCHE FICHIERS VOLUMINEUX
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  Chemin: /var
  Taille min: 100M
  Limite: 20 rรฉsultats
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Recherche en cours...

  TAILLE     MODIFIร‰              FICHIER
  ------     -------              -------
  2.3G       2024-01-15 10:30:22  /var/log/syslog.1
  1.8G       2024-01-14 23:59:59  /var/lib/mysql/database.ibd
  856M       2024-01-15 08:00:00  /var/cache/apt/archives/package.deb
  534M       2024-01-13 15:45:00  /var/log/nginx/access.log.1
  245M       2024-01-15 12:00:00  /var/lib/docker/overlay2/abc123/diff/data.tar
  189M       2024-01-10 09:30:00  /var/backups/dpkg.status.0

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  Total: 5.9G dans 6 ficyesterdays
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Cas d'Usage

Nettoyage Disque

# Trouver les gros ficyesterdays de log
./find-large-files.sh -t log -s 50M /var/log

# Trouver les gros ficyesterdays temporaires
./find-large-files.sh -s 100M /tmp /var/tmp

Audit Stockage

# Top 100 ficyesterdays du systรจme
sudo ./find-large-files.sh -n 100 -s 500M /

# Gros ficyesterdays utilisateur
./find-large-files.sh -s 1G /home/user

Voir Aussi