Получить самый новый файл из структуры каталога год / месяц / дата / время

Я храню резервные копии баз данных в структуре каталогов

year/month/day/time/backup_name

примером может служить

basics_mini / 2012/11/05/012232 / RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini / 2012/11/06/012251 / RATIONAL.0.db2inst1.NODE0000.20110505003930.001

обратите внимание, что временная метка из файла резервной копии не может быть использована. Перед началом тестирования автоматизации время сервера устанавливается на 5.5.2011

Поэтому вопрос заключается в том, как я могу получить последний файл, если я передам «базовый каталог» ( basics_mini ) на некоторую функцию, которую я собираюсь кодировать.

Мне нужно восстановить новейшую базу данных. Я делаю это в php, но мне интересно, есть ли простое решение для сценариев оболочки.

 find 'basics_mini' -type f | sed 's/.*basics_mini\///' | sort -t '/' -k1nr -k2nr -k3nr -k4nr | head -1 

Это найдет файлы в вашем резервном каталоге, тогда sed разделит ведущий путь (вплоть до вашего year ). Затем сортировка будет разделять путь на '/' и выполнять численный сортировку в полях 1, 2, 3 и 4, то есть год, месяц, день и время. Наконец, head -1 вернет верхнюю строку вывода.

Конечно, это приведет только к возврату 1 файла, даже если было несколько идентичных новейших записей (если это вас беспокоит).

поиск должен соответствовать вашим потребностям:

 find "/path/to/backup_dir" -type f|sort -r|head -n1 

Это работает, только если у вас есть (как в вашем примере), ведущие нули в ваших папках месяца и дня

Если вы хотите, чтобы резервная копия с определенным именем файла (или шаблоном) добавляла шаблон имени к параметрам поиска, например

 find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1 

… или использовать -iname для нечувствительных к регистру шаблонов

Теперь о деталях приведенных выше команд:

  • find "/path" рекурсивно перечисляет все файлы / директории в заданном пути (если вы не используете дополнительную фильтрацию:
  • параметр -type f find отфильтровывает все, что не является обычным файлом)
  • -name или -iname соответствии с определенным шаблоном
  • sort сортирует выход в обратном порядке ( -r )
  • head -n1 только печатает первую строку ( -n 1 ) своего ввода и сразу же выходит после этого.

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

 cd basics_mini set [0-9][0-9][0-9][0-9]/*/*/* shift $(($#-1)) echo "The most recent backup is in $1" 

В zsh вы можете напрямую получить последний каталог с квалификатором glob.

 echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1]) 

Мое решение было бы использовать это. Он выдаст самый новый файл:

 ls -lcR --full-time | grep '^-' | sort -k 6 -r | head -n 1 

Объяснение:

 ls -lcR 

-l использовать длинный формат списка

-c показать ctime (время последней модификации информации о статусе файла)

-R перечислить подкаталоги рекурсивно

grep для файлов, начинающихся с - (тире), что означает «обычные файлы».

 sort -k 6 -r 

-k Сортировка по столбцу n (6, так как это содержит поле даты)

-r Перевернутый

 head -n1 

-n количество строк для отображения (сверху вниз 1)

 find -maxdepth 1 -type ['d' for directory or 'f'for file] | ls -t | head -1 .. 

Это должно сработать.