Bash найти файлы и фильтр по дате и размеру - PullRequest
0 голосов
/ 27 марта 2019

У меня есть каталог с большим количеством файлов.Каждый день новые файлы добавляются автоматически.

Имена файлов имеют следующий формат: [GROUP_ID] _ [RANDOM_NUMBER] .txt Пример: 012_1234.txt

Для каждого дня, для каждого GROUP_ID (032, 024, 044 ... и т. Д.), Я хочу сохранить только самый большой файл дня.

Так, например, для двух дней 27 и 28 марта у меня есть:

March 27    -      012_1234.txt      -         12ko
March 27    -      012_0243.txt      -         3000ko
March 27    -      016_5647.txt      -         25ko
March 27    -      024_4354.txt      -         20ko
March 27    -      032_8745.txt      -         40ko

March 28    -      032_1254.txt      -         16ko
March 28    -      036_0456.txt      -         30ko
March 28    -      042_7645.txt      -         500ko
March 28    -      042_2310.txt      -         25ko
March 28    -      042_2125.txt      -         34ko
March 28    -      044_4510.txt      -         35ko

И я хочу получить:

March 27    -      012_0243.txt      -         3000ko
March 27    -      016_5647.txt      -         25ko
March 27    -      024_4354.txt      -         20ko
March 27    -      032_8745.txt      -         40ko

March 28    -      032_1254.txt      -         16ko
March 28    -      036_0456.txt      -         30ko
March 28    -      042_7645.txt      -         500ko
March 28    -      044_4510.txt      -         35ko

Не могу найти подходящую команду bash ls / find для этого, у кого-то есть идея?

С этой командой яможет отображать самый большой файл для каждого дня.

ls -l *.txt --time-style=+%s |
awk '{$6 = int($6/86400); print}' |
sort -nk6,6 -nrk5,5 | sort -sunk6,6

Но я хочу самый большой файл каждого файла GROUP_ID каждого дня.Таким образом, если для файла group_id "012" существует один файл из 10ko, я хочу его отобразить, даже если для идентификатора группы других пользователей есть файлы большего размера ...

1 Ответ

0 голосов
/ 27 марта 2019

Я нашел себе решение:

ls -l | tail -n+2 |
awk '{ split($0,var,"_"); group_id=var[5]; print $0" "group_id }' |
sort -k9,9 -k5,5nr |
awk '$10 != x { print } { x = $10 }'

Это дает мне самый большой файл для каждого group_id, так что теперь я просто добавляю для обработки часть дня.

Для информации:

tail -n+2: скрыть "общую" часть вывода команды ls

Первый awk: получить часть group_id (012, 036 ...) и отобразить ее после исходной строки ($ 0)

Сортировка: сортировка по имени файла и размеру

Возьмите наибольший размер каждого group_id (столбец 10 добавлен awk в начале)

...