я исключаю stat
и perl
, которые не являются POSIX, поэтому более вероятно, что они отсутствуют, чем ls
и awk
.
Я тоже исключаю wc
, поскольку в то время как реализация GNU wc
оптимизирована, когда используется вариант -c
, вы не должны полагаться на то, что он будет присутствовать для портативного сценария. Более того, некоторые нестандартные -c
могут возвращать количество символов -c, которое не обязательно совпадает с количеством байт -c в зависимости от локали.
В этом случае решение основано только на стандартных утилитах, которые сообщают размер файла в качестве аргумента:
filesize() {
[ -f "$1" ] && ls -dnL -- "$1" | awk '{print $5;exit}' || { echo 0; return 1; }
}
Остерегайтесь, однако, что сообщенный размер может быть либо больше, либо меньше фактического размера содержимого файла на диске, в зависимости от используемой файловой системы, поддержки разреженных файлов, а также таких опций, как сжатие или дедупликация.
Я бы, наверное, использовал , в то время как
И case
:
i=0 c=3
while case "$((i+=!(c==1))).$c" in
([MAX_REPEAT_NUM].*) ! break;;
(*.3) read c; continue ;;
(*.1) printf 'prompt> '
read d || continue ;;esac
do [ -d "$d" ] || continue
find "$REPLY" -type f \
-printf '%TY-%Tm-%Td %.8TT %p\n '|
sort -r | head -20
done
Таким образом можно проверить возможные ветви.
while true; do
echo "You have chosen to spec.... '/path/../'"
read
if [ -d "$REPLY" ]; then
find "$REPLY" -type f -printf '%TY-%Tm-%Td %.8TT %p\n '| sort -r | head -20
break
else
echo "could not find $REPLY, ensure the path is correct and try again"
echo "press enter to continue..."
read cont
fi
done