
Я хочу проверить, превышает ли размер нового файла 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. Если вы хотите учесть нерегулярные файлы (каталоги, символические ссылки, устройства...), удалите.
Идея состоит в том, чтобы расширить оба этих шара:
- список не скрытых обычных (
.
) файлов,o
упорядоченный поm
времени модификации, ограниченный одним ([1]
). - то же самое, но ограничено файлами,
L
длина которых строго больше (+
)2097152
(но с включениемN
ullGlob, чтобы не было фатальной ошибки, если совпадений нет).
И наше условие подразумевает, что оба глобуса расширяются в один и тот же файл.
Обратите внимание, что 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 ГБ)