Проверьте размер новейшего файла

Проверьте размер новейшего файла

Я хочу проверить, превышает ли размер нового файла 2 МБ:

test $(ls -st | head -n2 | tail -n1 | awk '{print $1}') -gt 2097152 && echo "true"

Есть ли более эффективный или элегантный способ сделать это?

Я попытался далее перенаправить вывод awk в

| test {} -gt 2097152

но получить

bash: тест: {}: ожидается целочисленное выражение

Затем

| test {}>"2097152"

всегда возвращает «истину», поэтому я придумал конструкцию

test $(...) -gt 2097152

решение1

Возможно, есть способы лучше, чем lsполучение самого нового файла, но большую часть того, что вы делаете, можно сделать просто в awk:

ls -st | awk 'NR == 2 && $1 > 2097152 {print "true"}'
  • NR == 2- во второй строке
  • $1 > 2097152- когда первый столбец больше 2097152

решение2

С zsh:

set -- *(.om[1]) *(N.L+2097152om[1])
if [[ $1 = $2 ]]; then
  printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
                "directory ($1) is strictly greater than 2MiB."
fi

Если вы хотите включить скрытые каталоги, добавьте Dк обоим квалификаторам glob. Если вы хотите учесть нерегулярные файлы (каталоги, символические ссылки, устройства...), удалите.

Идея состоит в том, чтобы расширить оба этих шара:

  1. список не скрытых обычных ( .) файлов, oупорядоченный по mвремени модификации, ограниченный одним ( [1]).
  2. то же самое, но ограничено файлами, Lдлина которых строго больше ( +) 2097152(но с включением NullGlob, чтобы не было фатальной ошибки, если совпадений нет).

И наше условие подразумевает, что оба глобуса расширяются в один и тот же файл.

Обратите внимание, что ls -s, сообщает не размер файлов, а их использование на диске (в количестве 512-байтовых единиц, или КиБ, или других единиц в зависимости от реализации lsи/или среды). lsсообщает размер файла в немдлинныйвыходной формат ( ls -lили ls -n(или -o/ -gв некоторых реализациях)).

Другой вариант — использовать встроенную zshфункцию statдля получения размера (или использования диска) самого нового файла:

zmodload zsh/stat
if
  stat -LH s -- *(.om[1]) &&
    ((s[size] > 2097152))
then
  printf '%s\n' "The apparent size of the newest non-hidden regular file in the current" \
                "directory ($1) is strictly greater than 2MiB."
fi

Или:

zmodload zsh/stat
if
  stat -LH s -- *(.om[1]) &&
    ((s[blocks] > 2097152))
then
  printf '%s\n' "The newest non-hidden regular file in the current directory" \
                "($1) uses more than 2097152 512-byte units of disk space."
fi

(другими словами, использование дискового пространства превышает 1 ГБ)

Связанный контент