Единственный способ присвоить значения позиционным параметрам в bash
- использовать встроенный set
:
set a b
назначает a
до $ 1
и b
до $ 2
(обратите внимание, что он сбрасывает весь список позиционных параметров, поэтому $ 3
, $ 4
... потеряны).
Итак, здесь вы можете сделать:
set -- "$(($1 / 1000))"
Чтобы присвоить значение $ 1
, разделенное на 1000, на $ 1
.
Напротив, с zsh
(более продвинутая оболочка, подобная Bourne, не являющаяся частью проекта GNU, присутствует во всех Unix, но часто не по умолчанию), вы можете назначать индивидуальные позиционные параметры, например:
1=$(($1 / 1000))
Или:
argv[1]=$(($1 / 1000))
Или:
(( argv[1] /= 1000 ))
( $ argv
- это специальный массив, привязанный к позиционным параметрам)
Вы по-прежнему не можете сделать:
let 1/=1000
(( 1/=1000 ))
.
zsh
также поддерживает арифметику с плавающей запятой, поэтому вы можете:
((argv[1] /= 1000.))
(использование a константы с плавающей запятой (1000.) вызывает арифметику с плавающей запятой).
Вы можете отобразить его так:
printf "%.2f$kilo\n" $1
Я в конечном итоге отслеживал его.
В системе есть сторожевое значение, которое перезагружает систему, если она не может связаться с определенными процессами. Проблема заключалась в том, что мое приложение было убито SIGTERM или SIGKILL и сначала не отключалась от сторожевого значения, что он делает, если используется SIGINT.
Эта перезагрузка во время отключения записывает эти ожеременные байты в WTMP. Теперь я написал скрипты запуска и выключения в /etc/init.d и ссылки на настройку в RC # .d, используя chkconfig, и проблема ушла /
Вам нужно решить эту проблему в целом или только один раз? Если вам просто нужно решить его один раз, иногда простое решение лучше всего. Мы можем использовать раскосы расширения в Bash:
rm vtm_data_12month_2014{09,10}{01..29}.txt
Это может работать в вашем случае, так как:
rm
вряд ли пошлет нас через ARG_MAX, и Если вам нужно решить эту проблему в более общем плане, вы должны учитывать тот факт, что разные месяцы заканчиваются в разные дни (октябрь, например, заканчивается 31 числа, но в вашем примере есть данные только до 30 числа).
Если на схему именования файлов в вашем примере можно положиться, то в следующем случае будут удалены все, кроме последнего файла, доступного для каждого месяца (на основе имени файла, а не фактических временных меток, связанных с созданием или изменением файла):
get_years() {
find ./ -type f | cut -d'_' -f4 | cut -c1-4 | sort | uniq
}
get_months_for_year() {
year=$1
find ./ -iname "vtm_data_12month_${year}*.txt" -type f | cut -d'_' -f4 | cut -c5-6 | sort | uniq
}
get_latest_for_year_month() {
year=$1
month=$2
find ./ -iname "vtm_data_12month_${year}${month}*.txt" -type f | cut -d'_' -f4 | cut -c7-8 | sort | tail -1
}
for year in $(get_years); do
for month in $(get_months_for_year $year); do
latest=$(get_latest_for_year_month $year $month)
end=$(($latest - 1))
for i in $(seq 1 $end); do
day=$(printf '%02d' $i)
rm vtm_data_12month_${year}${month}${day}.txt
done
done
done
Язык, отличный от bash, который имеет библиотеку DateTime, скорее всего, даст вам более экономное и надежное решение. Оба представленных здесь решения приведут к ошибкам в случае отсутствия файлов в течение определенных дней.
-121--205523- Проверка действительности даты и генерируемого диапазона дат затруднена и может привести к ошибкам с помощью сценария bash. Лучшим выбором было бы использовать python
или perl
или любые другие языки сценариев более высокого уровня, которые могут выполнять углубленные проверки. Я обновил сценарий, чтобы он мог удалять файлы в пределах диапазона дат и исключая диапазон дат.
Параметры будут такими же, как
Удаление файлов из диапазона
./dfile.py --from 20140929 --to 20141001 --range
Удаление файлов из диапазона
./dfile.py --from 20140929 --to 20141001 --out-range
Эта программа также создает полезное сообщение справки, если аргументы приведены неверно.
#!/usr/bin/env python3
import os
import sys
import argparse
import datetime
parser = argparse.ArgumentParser()
parser.add_argument('--from', dest="fromd", type=str, required=True, help="From date")
parser.add_argument('--to', dest="tod", type=str, required=True, help="To date")
parser.add_argument('--range', dest='drange', action='store_true', help="Delete files between the given date")
parser.add_argument('--out-range', dest="orange", action='store_true', help="Delete files apart form the given date")
args = parser.parse_args()
if args.drange and args.orange:
print('Enter either --range or --out-range option')
sys.exit(1)
elif not (args.drange or args.orange):
print('You must select either --range or --out-range option')
sys.exit(1)
from_date = args.fromd
to_date = args.tod
path='/tmp/tmp.54JUy4ZP6x/'
try:
from_date = datetime.datetime.strptime(from_date, '%Y%m%d').date()
to_date = datetime.datetime.strptime(to_date, '%Y%m%d').date()
except ValueError:
print('Check if the date has been given in YYYYMMDD format')
sys.exit(1)
files = [ x for x in os.listdir(path) if x.endswith('.txt') ]
for file in files:
file_date = datetime.datetime.strptime(file[17:25], '%Y%m%d').date()
if args.orange:
# Delete files out of date range
if not from_date < file_date < to_date:
print('Deleting file {}'.format(file))
os.remove(path + '/' + file)
else:
# Delete files within date range
if from_date < file_date < to_date:
print('Deleting file {}'.format(file))
os.remove(path + '/' + file)
Здесь все параметры являются конфигурируемыми, за исключением того, что в программе необходимо изменить путь
.
Надеюсь, это поможет вам.
-121--205524- Это двоичный файл, который считывается, например, last
(по умолчанию /var/log/wtmp
, можно также указать другой целевой объект с помощью -f
).
Таким образом, существует ли последняя разумная запись, полностью зависит от того, как последний реализует доступ к файлу и как он их использует (фиксированное количество записей с фиксированной длиной, к которым осуществляется доступ в раунде, например, один вариант).
WTMP
и NOTMP
файлы - двоичные файлы - не ASCII. Поэтому вы ожидаете увидеть данные не-ASCII. Если вы хотите прочитать их, используйте команду последнего
команда . Если эта команда работает, то файл в порядке.
Пример формата можно найти в Человек 5 WTMP
, который можно прочитать здесь .
Эта страница также упоминает это:
Обратите внимание, что структура UTMP из libc5 изменилась в libc6. Из-за этого двоичные файлы, использующие Star Libc5 struck, будут повреждены / var / run / utmp и / или / var / log / wtmp.
Если последний
не удается, может быть, это могло объяснить ваш гирдук Hexdump?