Bash查找文件并按日期和大小过滤

时间:2019-03-27 12:34:54

标签: bash shell find ls

我有一个包含很多文件的目录。 每天,都会自动添加新文件。

文件名的格式如下: [GROUP_ID] _ [RANDOM_NUMBER] .txt 范例:012_1234.txt

每天,对于每个GROUP_ID(032、024、044 ...等),我只想保留当天最大的文件。

例如,在3月27日和3月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 文件中最大的文件。 因此,即使10ko的“ 012” group_id文件只有一个文件,我也要显示它,即使其他组ID的文件更大...

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

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的最大大小(awk在开头添加第10列)