Переместите самый старый файл через крон

Opsware, кажется, популярная опция для управления, хотя у меня нет собственного опыта с ним.

Я знаю, что Вы упомянули, что имели Cat6k, но если Вы решаете пойти только с устройствами NX-ОС (Nexus, MDS), проверить продукт Cisco DCNM. Очевидно, это имеет очень хорошую интеграцию и для MDS и для Nexus, и было лучшим решением для нас в дата-центре, приносящем и SAN и Матрицу Ethernet под одним комплектом управления.

2
задан 3 August 2009 в 00:38
2 ответа

Непротестированный, вероятный багги:

#!/bin/sh

# last file in list sorted newest->oldest
OLDEST=$(ls -t /application/unresponsive | tail -1)

# make sure $OLDEST isn't empty string
if [ -n $OLDEST ]; then
    # quote in case of spaces and remove directory name
    mv "$OLDEST" /application/inbox/$(basename "$OLDEST").txt
fi
7
ответ дан 3 December 2019 в 08:51
  • 1
    Проходит мой тест глазного яблока. –  womble♦ 3 August 2009 в 00:47
  • 2
    о, так близко. $OLDEST будет содержать/application/unresponsive/2009-07-31, таким образом, Ваш mv попытается сохранить файл к /application/inbox//application/unresponsive/2009-07-31.txt, который несомненно перестанет работать. Должно быть довольно легко зафиксировать использование операторов сопоставления с образцом удара, но я никогда не могу помнить, какой путь они идут. –  David Pashley 3 August 2009 в 02:03
  • 3
    1. используйте " символы вокруг каждого использования переменных оболочки - Вы никогда не знаете, когда файл будет иметь пробел или что-то одинаково раздражающее в нем. –  cas 3 August 2009 в 04:08
  • 4
    2. используйте базовое имя для получения просто основного имени файла без dir, например, ' mv " $OLDEST" $/application/inbox/(базовое имя " $OLDEST") .txt' –  cas 3 August 2009 в 04:12
  • 5
    Хорошие места, David и Craig. I' ll обновляют мой ответ. –  markdrayton 3 August 2009 в 07:24

Если Вы хотите, чтобы это работало с файлами с пробелами (более устойчивый). Необходимо циклично выполниться по ним и использовать-nt (новейший на основе измененного времени) или-ot (самый старый) оператор сравнения с основной минутой / макс. алгоритмом. Вот пример от этого превосходного BashFAQ:

files=(*) newest=${f[0]}
for f in "${files[@]}"; do
  if [[ $f -nt $newest ]]; then
    newest=$f
  fi
done

Таким образом, Ваш пример был бы (не протестирован):

files=(/application/inbox/*) oldest=${f[0]}
for f in "${files[@]}"; do
  if [[ $f -ot $oldest ]]; then
    oldest=$f
  fi
mv "$oldest" /application/unresponsive/
done

Изучение, как не использовать вывод ls, лучше, я думаю. Вот ссылка на аргумент почему. Но я оставляю его до Вас, чтобы решить, верно ли это или просто pseudo-unix-guru ерунда :-)

2
ответ дан 3 December 2019 в 08:51
  • 1
    А-ч, аккуратный. I' m не вентилятор использования вывода ls так it' s хороший для наблюдения этого решения. –  markdrayton 3 August 2009 в 07:22

Теги

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