"Mac-style" unzipping on linux

С zsh:

#! /bin/zsh -

zmodload zsh/datetime # for $EPOCHREALTIME/strftime...
zmodload zsh/zselect  # for sub-second sleeps
zmodload zsh/mathfunc # for int()

# wait till start of the next minute at first
for ((next = (EPOCHSECONDS / 60 + 1) * 60;; next += 60)) {
  (( sleep = int((next - $EPOCHREALTIME) * 100) ))
  (( sleep <= 0 )) || zselect -t $sleep
  strftime -s now %T $next
  nicstat -i eth1 1 60 > log-$now.txt &
}

Я добавил & для асинхронного запуска nicstat исходя из предположения, что nicstat 1 60 займет чуть более одной минуты. Затем, если бы мы запустили его синхронно (то есть без &), он начал бы дрейфовать. Здесь мы следим за тем, чтобы nicstat запускали точно каждую минуту.

Однако nicstat 1 60 занимает чуть более 59 секунд для запуска, а не 60, в первой строке отображается не статистика за 12:00:00 до 12:00:01, а общая статистика с момента загрузки (или с момента последнего сброса статистики). А вторая строка (обозначенная 12:00:01) предназначена для статистики с 12:00:00 до 12:00:01 (а 60-я строка после 59 секунд с пометкой 12:00:59 — для статистики с 12:00:58 до 12:00:59).

Статистика за 12:00:59 до 12:01:00 будет отсутствовать. Таким образом, вы можете изменить его на nicstat 1 61, чтобы выходные данные содержали 61 строку, первую для статистики с момента загрузки и следующие 60 для статистики каждой секунды в эту минуту.

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

nicstat -i eth1 1 | awk '
  NR == 1 {header = $0; next}
  !/^[012]/ {next} # skip other headers
  {
    log = "log-" substr($0, 1, 6) "00.log"
    if (log != last_log) {
      if (last_log) close(last_log)
      print header > log
      last_log = log
    }
    print > log
  }'

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

5
14.03.2016, 14:28
1 ответ

Похоже, проблема в том, что в zip-файле используются несогласованные варианты регистра для имен каталогов. Именно для этого и предназначена файловая система ciopfs : она обеспечивает просмотр дерева каталогов без учета регистра. Есть пакет Ubuntu. Создайте представление существующего каталога, смонтировав файловую систему ciopfs во временный каталог, распакуйте zip-архив внутри этого представления, и вы получите архив, извлеченный в исходный каталог.

mkdir ~/case-insensitive
ciopfs ~/temp ~/case-insensitive
cd ~/case-insensitive
unzip -x __MACOSX -x '__MACOSX/*' /path/to/zip
cd ~/temp
fusermount -u ~/case-insensitive

Если по какой-то причине это не сработает, моим следующим кандидатом будет Python zipfile библиотека ( пример ).

3
27.01.2020, 20:42

Теги

Похожие вопросы