К сожалению, нет решения, возможного только с (датой )Solaris/Aix.
Если доступна дата gnu:
Построить нужную дату в переменной:
$ date +'%Y/%m/01 -9 months'
2017/07/01 -9 months
$ a=$(date +'%Y/%m/01 -9 months')
$ a=$(date -d "$a" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'
$ echo "$a"
MHHHRGFILE (20161001) 99991231
Или просто:
$ a=$(date -d "$(date +'%Y/%m/01 -9 months')" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'
Если доступен bash (4.2+ ):(используя 272 дня как эквивалентные 9 месяцам)
$ TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272))
20161001
$ a=$(TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272)))
Если ksh доступен:
$ printf "%(%Y%m%d)T" "9 month ago"
Если доступен Perl (9 месяцев приблизительно равны 3600 *24 *30 *9):
$ perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);'
20161001
$ a=$(perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);')
Добавить эту переменную к первой строкеfile
$ sed '1s/.*/&'"$a"'/' file >file.new; mv file.new file
Вот именно.
Подстановочные знаки, такие как dir/*
, всегда расширяются в одном и том же порядке. Эта функция вместе с текущим значением $i
может использоваться для отображения информации о ходе выполнения.
Текущее значение $i
можно получить, просмотрев процессы, запущенные в вашей системе. Команда , следующая за , выводит текущий запущенный экземпляр program
и его аргументы.
Если есть несколько процессов program
, вы можете использовать опцию --parent...
для pgrep
, чтобы сопоставлять только процессы, запущенные оболочкой, выполняющей цикл for
, который вы хотите проверить.
ps -o args= -fp $(pgrep program)
Извлеките значение $i
вручную, а затем получите прогресс, используя
a=(dir/*)
n=$(printf %s\\0 "${a[@]}" | grep -zFxnm1 'the exact value of $i' | cut -f1 -d:)
echo "Progress: $n / ${#a[@]}"
Это работает при двух предположениях
Содержимое dir/
не изменяется во время выполнения цикла. Если program
создает, переименовывает или удаляет файлы, то числа, скорее всего, неверны.
Вызов program
запускает новый процесс. Если program
является функцией bash
, то для program
не будет подпроцесса -. Если сама функция function
вызывает другую программу, которая запускает новый процесс, вы можете найти эту подпрограмму -. Однако,если program
— это bash, встроенный -в (команды, перечисленные в help
), или чистая функция bash (, которая использует только bash
встроенные -модули ), то вы вышли удачи.
Если у вас есть проблема 2 или ваш цикл for
имеет структуру, отличную от той, что указана в вопросе (, например, program < "$1"
или очень длинное тело цикла с множеством разных программ ), вы можете чтобы получить некоторую информацию о прогрессе из lsof
, просматривая файлы, открытые вашим текущим сеансом оболочки или его дочерними процессами.