Сценарий оболочки: Получите название последнего файла в папке алфавитным порядком

У меня есть папка с резервными копиями от базы данных MySQL, которые создаются автоматически. Их имя состоит из даты, как которая резервное копирование было сделано, так:

2010-06-12_19-45-05.mysql.gz  
2010-06-14_19-45-05.mysql.gz  
2010-06-18_19-45-05.mysql.gz  
2010-07-01_19-45-05.mysql.gz

Что путь состоит в том, чтобы получить имя файла последнего файла в списке, т.е. того, который в алфавитном порядке является последним?

В сценарии оболочки я хотел бы сделать что-то как

LAST_BACKUP_FILE= ???
gunzip $LAST_BACKUP_FILE;
14
задан yan 2 July 2010 в 07:48
поделиться

2 ответа

ls -1 | tail -n 1

Если вы хотите присвоить это переменной, используйте $ (...) или обратные кавычки.

FILE=`ls -1 | tail -n 1`
FILE=$(ls -1 | tail -n 1)
18
ответ дан 1 December 2019 в 08:42
поделиться

Ответ @Sjoerd правильный, я просто выберу из него несколько нит:

  1. вам не нужна опция -1 для принудительного использования одного пути на строка, если вы направите вывод куда-нибудь:

     ls | хвост -n 1
    
  2. вы можете использовать -r , чтобы получить листинг в обратном порядке, и взять первый:

     ls -r | голова -n 1
    
  3. gunzip some.log.gz запишет несжатые данные в some.log и удалит some.log.gz , что может быть или не быть тем, что вы хотите ( вероятно, нет). если вы хотите сохранить сжатый исходный код, перенаправьте его в gunzip :

     gunzip 
  4. вы можете захотеть защитить скрипт от ситуации, когда каталог не содержит файлов, поскольку

     gunzip $ empty_variable
    

расширяется до

    gunzip

, и такой вызов будет бесконечно ждать данных на стандартном вводе:

    latest="$(ls -r /some/where/*.gz | head -1)"
    if test -z "$latest"; then
      # there's no logs yet, bail out
      exit
    fi
    gunzip < $latest
7
ответ дан 1 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

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