Найти самый большой файл по имени в скрипте bash - PullRequest
2 голосов
/ 23 марта 2020

У меня json файлов с именами

logtext.json
logtext.json.1
logtext.json.2
logtext.json.3

Как найти файл с наибольшим номером с помощью скрипта bash? В этом случае вывод должен быть "logtext. json .3"

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Использовать sort --version-sort

-V, --version-sort
    natural sort of (version) numbers within text
find . -name "*.json*" | sort --version-sort | tail -n 1


Если сортировка name не требуется, просто используйте ls
ls | sort --version-sort | tail -n 1


tail -n 1 ограничивает вывод только одной строкой
$ ls
file.json  file.json.1  file.json.15  file.json.3
$ find . -name "*.json*" | sort --version-sort | tail -n 1
./file.json.15
2 голосов
/ 23 марта 2020

Я помещаю ответ здесь, не анализируя вывод ls, потому что это непереносимая плохая практика.

См .: https://unix.stackexchange.com/q/128985/310674

printf '%s\n' *.json* \
  | sort --reverse --version-sort \
  | head --lines=1
  • printf '%s\n' *.json*: создает поток всех файлов, разделенных новой строкой, соответствующих шаблону *.json*. Это переносимо и гораздо более надежно, чем синтаксический анализ выходных данных ls.
  • sort --reverse --version-sort: сортирует строки потока в обратном порядке с правилами сортировки номеров версий. Это поместит самую высокую версию в первую строку.
  • head --lines=1: печатает первую строку потока. Здесь он запрещает чтение всего потока до последней строки, поскольку он останавливается на первой строке.

Если вы используете версию утилит GNU, вы можете обработать null с разделителями список, а не newline список с разделителями. Это позволит обрабатывать имена файлов, которые могут содержать spaces, newlines или другие непечатаемые символы.

printf '%s\0' *.json* \
  | sort --reverse --version-sort --zero-terminated \
  | head --lines=1 --zero-terminated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...