У меня есть скрипт, который проверяет размер файла 0, но я подумал, что должен быть более простой способ проверить размер файлов. Т.е. file.txt
обычно 100к; как сделать проверку скрипта, если он меньше 90 КБ (включая 0), и заставить его получить новую копию, потому что в этом случае файл поврежден.
Чем я сейчас пользуюсь ..
if [ -n file.txt ]
then
echo "everything is good"
else
mail -s "file.txt size is zero, please fix. " myemail@gmail.com < /dev/null
# Grab wget as a fallback
wget -c https://www.server.org/file.txt -P /root/tmp --output-document=/root/tmp/file.txt
mv -f /root/tmp/file.txt /var/www/file.txt
fi
Ответы:
[ -n file.txt ]
не проверяет его размер, он проверяет, чтоfile.txt
длина строки не равна нулю, поэтому всегда будет успешно.Если вы хотите сказать "размер не равен нулю", вам нужно
[ -s file.txt ]
.Чтобы получить размер файла, вы можете использовать
wc -c
для получения размера (длины файла) в байтах:file=file.txt minimumsize=90000 actualsize=$(wc -c <"$file") if [ $actualsize -ge $minimumsize ]; then echo size is over $minimumsize bytes else echo size is under $minimumsize bytes fi
В данном случае это похоже на то, что вы хотите.
Но к вашему сведению, если вы хотите узнать, сколько места на диске использует файл, вы можете использовать его
du -k
для получения размера (используемого дискового пространства) в килобайтах:file=file.txt minimumsize=90 actualsize=$(du -k "$file" | cut -f 1) if [ $actualsize -ge $minimumsize ]; then echo size is over $minimumsize kilobytes else echo size is under $minimumsize kilobytes fi
Если вам нужен больший контроль над форматом вывода, вы также можете посмотреть
stat
. В Linux вы бы начали с чего-то вродеstat -c '%s' file.txt
, а в BSD / Mac OS X с чего-то вродеstat -f '%z' file.txt
.источник
du -b "$file" | cut -f 1
вместоstat -c '%s' "$file"
? Илиstat --printf="%s" "$file"
?stat
имеют разные флаги.... | cut -d' ' -f1
он работал в Ubuntu.wc -c < "$file"
(обратите внимание на<
), и в этом случае вам не нужна эта| cut ...
часть (которая, как указано , не работает в OSX). МинимальноеBLOCKSIZE
значение дляdu
OSX составляет512
.wc -c <filename
также используетfstat
иseek
? Обратите внимание, что этоfstat
принимает fd, а не путь.Меня удивляет, что никто не упомянул
stat
о проверке размера файла. Некоторые методы определенно лучше:-s
узнать, пуст файл или нет, проще, чем что-либо еще, если это все, что вам нужно. А если вы хотите найти файлы большого размера, тоfind
это, безусловно, путь.Мне также очень нравится
du
получать размер файла в килобайтах, но для байтов я бы использовалstat
:size=$(stat -f%z $filename) # BSD stat size=$(stat -c%s $filename) # GNU stat?
источник
stat
- отличная идея, но на CentOS у меня сработало именно это:size=$(stat -c%s $filename)
stat
, что в некоторых ситуациях это правильно , а разреженные файлы не актуальны в большинстве ситуаций, хотя, конечно, не во всех.альтернативное решение с awk и двойными скобками:
FILENAME=file.txt SIZE=$(du -sb $FILENAME | awk '{ print $1 }') if ((SIZE<90000)) ; then echo "less"; else echo "not less"; fi
источник
du
не поддерживается-b
. (Это может быть сознательным выбором стиля, но это лишь альтернатива: вы можете опустить$
префикс внутри(( ... ))
при ссылках на переменные:((SIZE<90000))
)$
awk
, используяread
(bash
внутреннюю команду):read SIZE _ <<<$(du -sb "$FILENAME")
Если у вас есть
find
этот синтаксис, вы можете использовать его:find -maxdepth 1 -name "file.txt" -size -90k
Это будет выводиться
file.txt
на стандартный вывод тогда и только тогда, когда размерfile.txt
меньше 90 КБ. Чтобы выполнить скрипт,script
еслиfile.txt
его размер меньше 90 КБ:find -maxdepth 1 -name "file.txt" -size -90k -exec script \;
источник
find . -maxdepth 1 -name "file.txt" -size -90k
Если вы ищете только размер файла:
$ cat $file | wc -c > 203233
источник
wc -c "$file"
был дан ответ в 2011 году (три года назад). Да,wc -c "$file"
проблема в том, что он выводит имя файла, а также количество символов, поэтому в ранних ответах была добавлена команда для разделения счетчика. Ноwc -c < "$file"
, который устраняет эту проблему, был добавлен в качестве комментария в мае 2014 года. Ваш ответ эквивалентен этому, за исключением того, что он добавляет «бесполезное использованиеcat
» . Кроме того, вы должны указывать все ссылки на переменные оболочки, если у вас нет веской причины не делать этого.Это работает как в Linux, так и в MacOS.
function filesize { local file=$1 size=`stat -c%s $file 2>/dev/null` # linux if [ $? -eq 0 ] then echo $size return 0 fi eval $(stat -s $file) # macos if [ $? -eq 0 ] then echo $st_size return 0 fi return -1 }
источник
stat, похоже, делает это с наименьшим количеством системных вызовов:
$ set debian-live-8.2.0-amd64-xfce-desktop.iso $ strace stat --format %s $1 | wc 282 2795 27364 $ strace wc --bytes $1 | wc 307 3063 29091 $ strace du --bytes $1 | wc 437 4376 41955 $ strace find $1 -printf %s | wc 604 6061 64793
источник
strace du --bytes $1 2>&1 >/dev/null | wc
Если это так, то на архитектуре amd64 на ArchLinux (обычно последние версии всего) у меня 45 строкdu
, 46 строкstat
, 47 строкwc
и 72 строки дляfind
.python -c 'import os; print (os.path.getsize("... filename ..."))'
портативный, все разновидности питона, избегает вариаций в диалектах статов
источник
Для получения размера файла как в Linux, так и в Mac OS X (и, предположительно, в других BSD) существует не так много вариантов, и большинство из предложенных здесь будут работать только в одной системе.
Учитывая
f=/path/to/your/file
,что работает как в Linux, так и в Mac Bash:
size=$( perl -e 'print -s shift' "$f" )
или
size=$( wc -c "$f" | awk '{print $1}' )
Другие ответы отлично работают в Linux, но не в Mac:
du
не имеет-b
опции в Mac, и трюк BLOCKSIZE = 1 не работает («минимальный размер блока равен 512», что приводит к неверному результату)cut -d' ' -f1
не работает, потому что на Mac номер может быть выровнен по правому краю и дополнен пробелами впереди.Так что, если вам нужно что - то гибкое, это либо
perl
«s-s
оператор, илиwc -c
конвейеруawk '{print $1}'
(AWK будет игнорировать ведущее белое пространство).И, конечно же, что касается остальной части вашего исходного вопроса, используйте оператор
-lt
(или-gt
):if [ $size -lt $your_wanted_size ]; then
и т.п.источник
size=$(wc -c < "$f")
(обратите внимание<
, что приводитwc
к сообщению только числа). Повторное сравнение: не забывайте более "bash-ful"if (( size < your_wanted_size )); then ...
(а также[[ $size -lt $your_wanted_size ]]
).На основании ответа gniourf_gniourf,
будет писать
file.txt
в стандартный вывод тогда и только тогда, когда размерfile.txt
меньше 90 КБ, ивыполнит команду,
command
еслиfile.txt
его размер меньше 90 КБ. Я тестировал это в Linux. Отfind(1)
,(курсив мой).
источник
ls -l $file | awk '{print $6}'
предполагая, что команда ls сообщает размер файла в столбце №6
источник
Я хотел бы использовать
du
«S--threshold
для этого. Не уверен, что эта опция доступна во всех версияхdu
но она реализована в версии GNU.Цитата из руководства du (1) :
-t, --threshold=SIZE exclude entries smaller than SIZE if positive, or entries greater than SIZE if negative
Вот мое решение, использующее
du --threshold=
вариант использования OP:THRESHOLD=90k if [[ -z "$(du --threshold=${THRESHOLD} file.txt)" ]]; then mail -s "file.txt size is below ${THRESHOLD}, please fix. " myemail@gmail.com < /dev/null mv -f /root/tmp/file.txt /var/www/file.txt fi
Преимущество этого состоит в том, что
du
можно принимать аргумент для этой опции в известном формате - будь то человеческий, как в10K
,10MiB
или любой другой , который вам удобен - вам не нужно вручную преобразовывать между форматами / единицами, поскольку этоdu
обрабатывает.Для справки, вот объяснение этого
SIZE
аргумента на странице руководства:The SIZE argument is an integer and optional unit (example: 10K is 10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000). Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
источник
du
которые его не поддерживают.--threshold
Опция была добавлена в Coreutils 8.21, выпущенная в 2013 году .Хорошо, если у вас Mac, сделайте следующее:
stat -f %z "/Users/Example/config.log"
вот и все!источник