Скрипт не работает для рекурсивного просмотра каталогов

Я решил эту проблему с помощью bash-скрипта... (вкратце он использует rmmod cifs/modprobe cifs - после этого я смог монтировать ресурс без таймаута..ü)

#!/bin/bash

which timeout > /dev/null 2>&1; if [[ $? -ne 0 ]]; then echo -e '\nerror, no coreutils package'; exit 1; fi
which nc > /dev/null 2>&1; if [[ $? -ne 0 ]]; then echo -e '\nerror, no nc package'; exit 1; fi

# variables
    PATHTOIT="//192.168.1.1/SHARE"

# functions
function notthesame()
{
    # umount PATHTOIT
        while `mount | grep -qi $PATHTOIT`; do timeout -s 9 2 umount -l $PATHTOIT; done
        timeout -s 9 2 pkill -9 -f "SHARE"
        timeout -s 9 2 pkill -9 -f "umount -a -t cifs"
        timeout -s 9 2 pkill -9 -f "/sbin/mount.cifs"
        timeout -s 9 2 pkill -9 -f "rmmod -fw cifs"
        timeout -s 9 2 pkill -9 -f "/sbin/modprobe -q -- cifs"
        timeout -s 9 2 pkill nautilus

    # remove/add cifs kernel module
        timeout -s 9 2 rmmod -fw cifs
        timeout -s 9 2 modprobe cifs

    # mount PATHTOIT
        timeout -s 9 2 mount $PATHTOIT
}

while true; do

    # wait until we can reach the samba server
        while true; do nc -w 1 192.168.1.1 139 >& /dev/null && break && sleep 10; done

    # first sample
        REGIINTERF=`netstat -nr | awk '/0/ {print $NF}' | sort -u`

    # sleep 10
        sleep 10

    # second sample
        MILYENINTERFMOST=`netstat -nr | awk '/0/ {print $NF}' | sort -u`

    # compare the samples
        [ "${MILYENINTERFMOST}" = "${REGIINTERF}" ] || notthesame

    # if can't find mountpoint then mount it
        if ! mount | grep -qi $PATHTOIT; then notthesame; fi

done
0
03.06.2018, 00:45
2 ответа

Основная проблема в вашем коде (помимо использования раскрытия переменных без кавычек повсюду и того, что вы зацикливаетесь на выводеlsбез необходимости )заключается в том, что вы не добавляете префикс к имени файла, который вы запустите ls -lдальше с его именем каталога. У вас также могут возникнуть трудности с сопоставлением вывода размера с каталогом, размер которого это.

Вы также используете returnдля возврата размера из вашей функции. Оператор returnследует использовать для возврата статуса выхода из функции (ноль — успех, не -ноль — сбой, значения должны быть меньше 256 ).

Реализация функции оболочки:

#!/bin/bash

# Uses stat to get the total size in bytes of all files in the directory
# given on the function's command line. Assumes Linux "stat".
printdirsize () {
    local dir="$1"
    local sum=0

    shopt -s dotglob nullglob

    for filename in "$dir"/*; do
        [ ! -f "$filename" ] && continue  # skip non-regular files
        size=$( stat -c %s "$filename" )
        sum=$(( sum + size ))
    done

    printf 'Directory=%s\nSize=%d\n' "$dir" "$sum"
}

# Walks the directory tree from the given directory, calls printdirsize
# (above) and then descends into the subdirectories recursively.
dirwalker () {
    local dir="$1"

    printdirsize "$dir"

    shopt -s dotglob nullglob

    for filename in "$dir"/*; do
        [ ! -d "$filename" ] && continue  # skip non-directories
        dirwalker "$filename"
    done
}

# Start in the directory given on the command line, or use $HOME if
# nothing was given
dirwalker "${1:-$HOME}"

Это дало бы кажущийся размер всех каталогов. duдаст фактический размер, выделенный на диске. Разница заключается в том, как будут подсчитываться разреженные файлы.

То же самое, но с использованием findдля генерации путей к каталогам для printdirsizeфункции (, извлеченной здесь и используемой как встроенный скрипт, вызываемыйfind):

#!/bin/sh

find "${1:-$HOME}" -type d -exec bash -O dotglob -O nullglob -c '
    for dir do
        sum=0
        for filename in "$dir"/*; do
            [ ! -f "$filename" ] && continue  # skip non-regular files
            size=$( stat -c %s "$filename" )
            sum=$(( sum + size ))
        done
        printf "Directory=%s\nSize=%d\n" "$dir" "$sum"
    done' bash {} +

Единственное отличие от рекурсивной функции состоит в том, что порядок каталогов в выводе может быть другим.

1
28.01.2020, 02:43

Si solo desea que el tamaño de todos los archivos en su directorio du -sh *no funcione para usted?

0
28.01.2020, 02:43

Теги

Похожие вопросы