Сzsh
:
#! /usr/bin/env zsh
days=${1-30}
zmodload zsh/datetime || exit
strftime -s cutoff %Y%m%d $((EPOCHSECONDS - days * 24 * 60 * 60))
old_enough() {
year=$REPLY[5,6]
((year += 1900 + (year < 70) * 100))
[[ $year$REPLY[1,4] < $cutoff ]]
}
set -o extendedglob
echo rm -rf [0-9](#c6)(/+old_enough)
Удалите echo
или подключитесь к sh
, если все устраивает.
Для ksh93
эквивалентом может быть:
#! /usr/bin/env ksh
days=${1-30}
cutoff=$(printf '%(%Y%m%d)T' "$days days ago")
old_enough() {
year=${1:4}
((year += 1900 + (year < 70) * 100))
[[ $year${1:0:4} < $cutoff ]]
}
dirs=()
for f in {6}([0-9]); do
[ -d "$f" ] && [ ! -L "$f" ] && old_enough "$f" && dirs+=("$f")
done
if ((${#dirs[@]})); then
echo rm -rf "${dirs[@]}"
else
echo >&2 "No match"
exit 1
fi
Для bash
эквивалентом может быть:
#! /usr/bin/env bash
days=${1-30}
printf -v now '%(%s)T' -1
printf -v cutoff '%(%Y%m%d)T' "$((now - days * 24 * 60 * 60))"
old_enough() {
year=${1:4}
year=${year#0} # work around bug where bash complains about 08 and 09
((year += 1900 + (year < 70) * 100))
[[ $year${1:0:4} < $cutoff ]]
}
shopt -s nullglob
dirs=()
for f in [0-9][0-9][0-9][0-9][0-9][0-9]; do
[ -d "$f" ] && [ ! -L "$f" ] && old_enough "$f" && dirs+=("$f")
done
if ((${#dirs[@]})); then
echo rm -rf "${dirs[@]}"
else
echo >&2 "No match"
exit 1
fi
Годы старше 70 считаются прошлым веком(123199
означает 1999 -12 -31, 092217
означает 2017 -09 -22 ).
Если у вас нет ни одной из этих оболочек и вы используете систему Unix (, а не GNU (UNG )), тогда лучше всего прибегнуть кperl
:
#! /usr/bin/env perl
use POSIX;
$cutoff = time - ($ARGV[0] // 30) * 24 * 60 * 60;
$, = " "; $\ = "\n";
if (@dirs = grep {
/^(\d\d)(\d\d)(\d\d)$/ && ! -l && -d &&
mktime(0,0,0,$2,$1-1,$3+100*($3<70)) < $cutoff} <*>) {
print "rm -rf", @dirs;
} else {
die "No match";
}
Файлы systemd, расположенные в /usr/lib/systemd
, не предназначены для изменения пользователем. Файлы модулей можно поместить в /etc/systemd/system
для переопределения конфигураций в файле модулей, предоставленном операционной системой. В вашем случае вам нужен файл с именем /etc/systemd/system/nginx.service
, содержащий только следующее:
[Service]
ExecStart=/usr/sbin/nginx -e /nginx/nginx.conf
Причина, по которой ваш пример awk
не работает, заключается в том, что вы пытаетесь использовать переменные оболочки внутри одинарных кавычек,где они не расширяются и остаются буквальными. Вы можете использовать опцию -v
для awk
для передачи переменных оболочки:
awk -v "LINE=$LINE" -v "APPEND=$APPEND" -v "CONFIG=$CONFIG" 'NR==LINE{gsub(APPEND, APPEND""CONFIG)};1' $FILE > tmp && mv tmp $FILE