Я решил эту проблему с помощью 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
Основная проблема в вашем коде (помимо использования раскрытия переменных без кавычек повсюду и того, что вы зацикливаетесь на выводе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 {} +
Единственное отличие от рекурсивной функции состоит в том, что порядок каталогов в выводе может быть другим.
Si solo desea que el tamaño de todos los archivos en su directorio du -sh *
no funcione para usted?