Cat * и порядок файлов с одинаковыми именами - PullRequest
0 голосов
/ 23 января 2020

Я загружаю несколько файлов журналов, но они автоматически именуются во время загрузки, поэтому порядок указан неверно:

21-Jan-2020 20:01.log
21-Jan-2020 20:02 1.log
21-Jan-2020 20:02.log
21-Jan-2020 20:03 1.log
21-Jan-2020 20:03 2.log
21-Jan-2020 20:03 3.log
21-Jan-2020 20:03 4.log
21-Jan-2020 20:03 5.log
21-Jan-2020 20:03.log
21-Jan-2020 20:04.log

Обратите внимание, что 21-Jan-2020 20:02.log идет после 21-Jan-2020 20:02 1.log, а также 21-Jan-2020 20:03.log после 21-Jan-2020 20:03 1.log, et c. Правильный порядок будет следующим:

21-Jan-2020 20:01.log
21-Jan-2020 20:02.log
21-Jan-2020 20:02 1.log
21-Jan-2020 20:03.log
21-Jan-2020 20:03 1.log
21-Jan-2020 20:03 2.log
21-Jan-2020 20:03 3.log
21-Jan-2020 20:03 4.log
21-Jan-2020 20:03 5.log
21-Jan-2020 20:04.log

Один из вариантов - переименовать файлы, но я пытаюсь использовать cat.

Когда я использую cat *.log > all.log, отметки даты и времени файлы журналов не в порядке, потому что файлы не в порядке.

Я бы хотел как-то исправить порядок. Я нашел этот пост , но мне не удалось изменить его, поэтому он соответствует моим целям.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Расширение пути

После разделения слов, если не установлена ​​опция -f, bash сканирует каждое слово на наличие символов *, ? и [. Если появляется один из этих символов, слово считается шаблоном, и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону.

source: man bash

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

Кроме того, формат данных, который используется в ваших именах файлов, также не сортируется. Представьте, что вы получите файл "21-Feb-2020 20: 01.log". Он будет указан перед всеми файлами с января. Всегда полезно использовать сортируемые форматы даты и времени. Типичным примером будет YYYYMMDDhhmm.log, и, поскольку вы используете там счетчик последовательности, вы можете захотеть использовать имена файлов, такие как YYYYMMDDhhmm_nn.log, где nn - это число, начинающееся с 00.

Мы могли бы придумать увлекательное правило, как приводить ваши файлы в порядок. Тем не менее, я бы посоветовал быстро переименовать ваши файлы:

for file in *.log; do
   read date time seq <<<"${file%.log}"
   file_new="$(printf "%s_%0.2d.log" "$(date -d "$date $time" '+%FT%H:%M')" "${seq}")"
   mv "${file}" "${file_new}"
done

Вы также можете просто сделать мягкую ссылку на /path/to/tempdir с таким именем.

И тогда вы можете сделать

cat *.log > full.log

примечание: Если вам нужно только объединить файлы одного дня, решение nullPointer сработает.

0 голосов
/ 23 января 2020

Вы можете попробовать sort -V

Поместить имена файлов в файл с именем list.txt, а затем выполнить следующее:

cat list.txt | sort -V

создаст нужный вам порядок:

21-Jan-2020 20:01.log
21-Jan-2020 20:02.log
21-Jan-2020 20:02 1.log
21-Jan-2020 20:03.log
21-Jan-2020 20:03 1.log
21-Jan-2020 20:03 2.log
21-Jan-2020 20:03 3.log
21-Jan-2020 20:03 4.log
21-Jan-2020 20:03 5.log
21-Jan-2020 20:04.log

С man sort:

-V, --version-sort натуральная сортировка (версии) чисел внутри текста

...